图论--DFS-SPFA求负环
模板:洛谷P3385
由于DFS-SPFA可以在找到负环后及时退出,所以不会像BFS-SPFA那样TLE。
代码:
#include<bits/stdc++.h>
using namespace std;
inline void read(int &x){
x=0;
int k=1;
char ch=' ';
while(ch!='-'&&(ch<'0'||ch>'9')){
ch=getchar();
}
if(ch=='-'){
k=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
x*=k;
}
struct edge{
int to,w,next;
}e[400001];
int tot;
int head[200001];
inline void addedge(int x,int y,int w){
e[++tot].to=y;
e[tot].next=head[x];
e[tot].w=w;
head[x]=tot;
}
int n,m;
int vis[200001];
int d[200001];
int flag;
void spfa(int x){
if(vis[x]){
flag=1;
return;
}
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int u=e[i].to;
if(d[u]>d[x]+e[i].w){
d[u]=d[x]+e[i].w;
spfa(u);
if(flag)return;
}
}
vis[x]=0;
}
int main(){
int F;
read(F);
while(F--){
memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
memset(head,0,sizeof(head));
tot=0;
flag=0;
read(n);
read(m);
for(int i=1;i<=m;i++){
int x,y,l;
read(x);
read(y);
read(l);
if(l>=0){
addedge(x,y,l);
addedge(y,x,l);
}
else{
addedge(x,y,l);
}
}
for(int i=1;i<=n;i++){spfa(i);if(flag)break;}
if(flag)printf("YE5\n");
else printf("N0\n");
}
return 0;
}