【模板】负环
利用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;
}

浙公网安备 33010602011771号