题目链接:负环
这个题题目告诉我们不能用 BFS-SPFA 来做(然而,菜鸡好像只会着一种判断负环的方法。。
分享一篇大佬写的 DFS-SPFA
百度上说判断负环时 dfs 要比 bfs 快得多!!!
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 200005;
#define INF 1e9
struct Node{
int to;
int ne;
int w;
}e[N<<1];
int head[N],dis[N];
bool vis[N],vist;
int n,m,T,val,x,y,cnt;
void init()
{
memset(head,-1,sizeof(head));
memset(dis,0,sizeof(dis));
memset(vis,false,sizeof(vis));
cnt = vist = 0;
}
void add(int u,int v,int val)
{
e[cnt].to = v;
e[cnt].w = val;
e[cnt].ne = head[u];
head[u] = cnt ++;
}
void spfa(int s)
{
vis[s] = true;
for(int i=head[s];~i;i=e[i].ne)
{
int t = e[i].to;
if(dis[s] + e[i].w < dis[t])
{
dis[t] = dis[s] + e[i].w;
if(vis[t]||vist)
{
vist = true;
break;
}
spfa(t);
}
}
vis[s] = false;
}
int main()
{
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
if(val >= 0)
add(y,x,val);
}
for(int i=1;i<=n;i++)
{
spfa(i);
if(vist)
break;
}
if(vist) printf("YE5\n");
else printf("N0\n");
}
return 0;
}