图论--DFS-SPFA求负环

模板:洛谷P3385
由于DFS-SPFA可以在找到负环后及时退出,所以不会像BFS-SPFA那样TLE。
代码:

#include
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;
}

转载于:https://www.cnblogs.com/stone41123/p/7581269.html

你可能感兴趣的:(图论--DFS-SPFA求负环)