Bellman-Ford 哪个大佬能告诉我错哪了......我太难了
查看原帖
Bellman-Ford 哪个大佬能告诉我错哪了......我太难了
362112
fussyguy楼主2020/11/12 13:22
#include<bits/stdc++.h>
#define cn getchar
using namespace std;
const int N = 3e6+5;

inline void read(int &x){
	 x = 0;int f1 = 1;char ch = cn();
	 while(!isdigit(ch)){if(ch == '-')f1 = -1;ch = cn();}
	 while(isdigit(ch)) x = x * 10 + ch - '0',ch = cn(); x*=f1;
}
inline int add(int a,int b){
	if(a == 0x3f3f3f3f || b == 0x3f3f3f3f) return 0x3f3f3f3f;
	return a+b;
}
struct E{
	int u,v,w;
}e[N];
int T;
int dis[N];
int main(){
	read(T);
	while(T--){
		memset(e,0,sizeof(e));
		memset(dis,0x3f,sizeof(dis));
		int n,m,k;
		dis[1] = 0;
		read(n);read(m);
		for(register int i=k=0 ; i<m ; i++,k++){
			int u,v,w;
			read(u);read(v);read(w);
			e[k] = (E){u,v,w};
			if(w >= 0) e[++k] = (E){v,u,w};
		}
		bool f = false;
		for(register int i=1 ; i<n ; i++){
			f = true;
			for(int j=0 ; j<k ; j++){
				if(add(dis[e[j].u],e[j].w) < dis[e[j].v]){
					f = true;
					dis[e[j].v] = dis[e[j].u] + e[j].w;
				}
			}
			if(f) break;
		}
		for(int j=0 ; j<k ; j++){
			if(add(dis[e[j].u],e[j].w) < dis[e[j].v]){
				goto YES;
			}
		}
		puts("NO");
		continue;
		YES:puts("YES");			
	}
	return 0;
}

2020/11/12 13:22
加载中...