WA了第六个点,求大佬解答
查看原帖
WA了第六个点,求大佬解答
86973
花园Serena楼主2020/10/15 08:48

RT 代码如下

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int MAXN = 1000 + 10, MAXM = 20000 + 10;
LL val[MAXM], dis[MAXN];
int nxt[MAXM], to[MAXM], head[MAXN], num[MAXN];
int n, ML, MD, cnt =  0;
bool vis[MAXN];
void inline add(int x, int y, int w) {
	to[++ cnt] = y; val[cnt] = w;
	nxt[cnt] = head[x]; head[x] = cnt;
}
void inline spfa(int s) {
	queue <int> q; q.push(s);
	dis[s] = 0; vis[s] = false;
	while (!q.empty()) {
		int x = q.front(); q.pop(); vis[x] = false;
		for(register int i = head[x]; i; i = nxt[i]) {
			int y = to[i];
			if(dis[y] > dis[x] + val[i]) {
				dis[y] = dis[x] + val[i];
				num[y] = num[x] + 1;
				if(num[y] > n) {printf("-1\n"); exit(0);}
				if(!vis[y]) {q.push(y); vis[y] = true;}
			}
		}
	}
}
void inline clean () {
	memset(vis, false, sizeof(vis));
	memset(dis, 0x3f, sizeof(dis));
	memset(num, 0, sizeof(num));
}
int main ()  {
	scanf("%d%d%d", &n, &ML, &MD);
	for(register int i = 1; i <= ML; i ++) {
		int x, y, d;
		scanf("%d%d%d", &x, &y, &d);
		add(x, y, d);
	}
	for(register int i = 1; i <= MD; i ++) {
		int x, y, d;
		scanf("%d%d%d", &x, &y, &d);
		add(y, x, -d);
	}
	for(register int i = 1; i <= n; i ++) {
		add(0, i, 0); 
		if(i != n) add(i + 1, i, 0);
	}
	clean(); spfa(0); clean(); spfa(1);
	if(dis[n] == 0x3f3f3f3f) printf("-2\n");
	else printf("%lld\n", dis[n]);
	return 0;
}
2020/10/15 08:48
加载中...