【模板】负环

模板链接
用spfa找负环,当到一个点的最短路径超过n条时,则一定有负环。
时间:4148ms。

#include<bits/stdc++.h>
using namespace std;
int T,ver[60001],nxt[6001],hed[6001],tot,bian[6001],dian[2001],bj[2001],jl[2001],n,m;
void add(int x,int y,int z){
    ver[++tot]=y,nxt[tot]=hed[x],hed[x]=tot,bian[tot]=z;
}
queue<int>q;
bool spfa(){
    while(q.size()) q.pop();
    q.push(1),bj[1]=1,jl[1]=0;
    while(q.size()){
        int x=q.front();
        q.pop(),bj[x]=0;
        for(int i=hed[x],y;i;i=nxt[i]){
            y=ver[i];
            if(jl[y]>jl[x]+bian[i]){
                jl[y]=jl[x]+bian[i];
                dian[y]=dian[x]+1;
                if(dian[y]>=n)
                    return false;
                if(!bj[y])
                    bj[y]=1,q.push(y);
            }

        }
    }
    return true;
}
int main(){
    scanf("%d",&T);
    while(T--){
        tot=0;
        bool q;
        memset(dian,0,sizeof(dian));
        memset(hed,0,sizeof(hed));
        memset(nxt,0,sizeof(nxt));
        memset(bj,0,sizeof(bj));
        memset(jl,0x3f,sizeof(jl));
        scanf("%d%d",&n,&m);
        for(int i=1,mm,mmm,mmmm;i<=m;i++){
            scanf("%d%d%d",&mm,&mmm,&mmmm);
            add(mm,mmm,mmmm);
            if(mmmm>=0)
                add(mmm,mm,mmmm);
        }
        if(spfa()) printf("N0\n");
        else printf("YE5\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sjzezwzy/article/details/80956670