Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 10000
#define inf 10000000
using namespace std;
int hd[maxn],to[maxn<<1],nex[maxn<<1],val[maxn<<1];
int d[maxn],vis[maxn];
int edges,flag;
void add(int u,int v,int c)
{
nex[++edges]=hd[u], hd[u]=edges, to[edges]=v, val[edges]=c;
}
void spfa(int u)
{
int v;
vis[u]=1;
for(int i=hd[u];i;i=nex[i])
{
v=to[i];
if(d[u]+val[i]<d[v])
{
if(vis[v] || flag)
{
flag=1;
break;
}
d[v]=d[u]+val[i];
spfa(v);
}
}
vis[u]=0;
}
void re()
{
memset(hd,0,sizeof(hd));
memset(vis,0,sizeof(vis));
for(int i=1;i<maxn;++i) d[i]=inf;
edges=flag=0;
}
int main()
{
// setIO("input");
int F;
scanf("%d",&F);
while(F--)
{
re();
int n,m,w, a,b,c;
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b, c),add(b,a,c);
}
for(int i=1;i<=w;++i)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,-c);
}
for(int i=1;i<=n;++i)
{
d[i]=0;
spfa(i);
if(flag) break;
}
if(flag==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
原文:https://www.cnblogs.com/guangheli/p/10977545.html