【模板】负环

24 篇文章 0 订阅
17 篇文章 0 订阅

模板链接
用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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值