【模板】负环

利用Bellman-Ford 算法来处理负环
例题洛谷P3385

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
struct Edge{
	int u,v,w;
}edge[70005];
long long dis[70005];
int tot;
int T,n,m,u,v,w,flag;
inline void add(int u,int v,int w){
	tot++;
	edge[tot].u=u;
	edge[tot].v=v;
	edge[tot].w=w;	
}
inline int ADD(int x,int y){
	if(x==0x3f3f3f3f||y==0x3f3f3f3f){
		return 0x3f3f3f3f;
	}
	else return x+y;
}
int main(){
	  //freopen("testdata.in", "r", stdin);
	cin>>T;
	while(T--){
		fill(dis,dis+70005,0x3f3f3f3f);
		memset(edge,0,sizeof(edge));
		tot=0;
		cin>>n>>m;
		for(int i=0;i<m;i++){
			cin>>u>>v>>w;
			add(u,v,w);
			if(w>=0) add(v,u,w);
		}
		dis[1]=0;
		flag=0;
		for(int i=0;i<n;i++){
			for(int j=1;j<=tot;j++){
				if(dis[edge[j].v]>ADD(dis[edge[j].u],edge[j].w)){
					dis[edge[j].v]=dis[edge[j].u]+edge[j].w;
					if(i==n-1) {
					flag=1;
					break;
					}
				}	
			}
		}
		if(flag==1)
		puts("YES");
		else puts("NO");
	}
  return 0;
}





posted @ 2020-09-24 21:33  一个经常掉线的人  阅读(113)  评论(0)    收藏  举报