题目
寻找一个从顶点1所能到达的负环
分析
首先要深搜判断是否从1出发可到达,然后跑一遍Bellman-Ford。
代码
#include <cstdio>
#include <cstring>
#include <cctype>
#define rr register
using namespace std;
struct node{int x,y,w,next;}e[6001]; int ls[2001],v[2001];
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void dfs(int x,int fa){
if (v[x]) return; v[x]=1;
for (rr int i=ls[x];i;i=e[i].next)
if (e[i].y!=fa) dfs(e[i].y,x);
}
signed main(){
for (rr int t=iut();t;--t){
memset(ls,0,sizeof(ls));
memset(v,0,sizeof(v));
rr int n=iut(),k=0,dis[2001],flag=0;
for (rr int m=iut();m;--m){
rr int x=iut(),y=iut(),w=iut();
e[++k]=(node){x,y,w,ls[x]},ls[x]=k;
if (w>=0) e[++k]=(node){y,x,w,ls[y]},ls[y]=k;
}
memset(dis,127/3,sizeof(dis)); dfs(1,0); dis[1]=0;
for (rr int i=1;i<n;++i)
for (rr int j=1;j<=k;++j)
if (dis[e[j].y]>dis[e[j].x]+e[j].w)
dis[e[j].y]=dis[e[j].x]+e[j].w;
for (rr int i=1;i<=k&&!flag;++i)
if (dis[e[i].y]>dis[e[i].x]+e[i].w&&v[e[i].x]) flag=1;
if (flag) printf("YE5\n"); else printf("N0\n");
}
return 0;
}