【SPFA】判负环 bzoj1715 Wormholes虫洞
dfs实现的SPFA判负环较快 访问到已访问的点即为负环
bfs要开数组记录访问过n次
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int num,last[505],nxt[5505],ver[5505],len[5505];
inline void add(int x,int y,int z)
{nxt[++num]=last[x]; last[x]=num; ver[num]=y; len[num]=z;
}
int dis[505]; bool vis[505],flag=0;
void spfa(int x)
{vis[x]=1;
for(int i=last[x];i;i=nxt[i])
{int y=ver[i];
if(dis[x]+len[i]<dis[y])
{dis[y]=dis[x]+len[i];
if(vis[y]) {flag=1;return;}
spfa(y);
}
}
vis[x]=0;
}
int main()
{
int t,x,y,z,m,w; scanf("%d",&t);
while(t--)
{ memset(last,0,sizeof(last));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
num=0; flag=0;
scanf("%d%d%d",&n,&m,&w);
while(m--)
{scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z);}
while(w--)
{scanf("%d%d%d",&x,&y,&z); add(x,y,-z);}
for(int i=1;i<=n;i++) {spfa(i); if(flag) break; }
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}