负环

允我心安 提交于 2019-11-29 04:57:12
#include<bits/stdc++.h>
using namespace std;
struct edge
{
    int to,len,next;
}edge[2000000];
long long n,m,s,num,tim[2000000],head[2000000],book[2000000],dis[2000000],b[20000000];
priority_queue<pair<long long,long long> > q;
void sett()
{
    n=m=s=num=0;
    memset(tim,0,sizeof(tim));
    memset(book,0,sizeof(book));
    memset(head,0,sizeof(head));
}

void add(long long u,long long v,long long w)
{
    edge[++num].to=v;
    edge[num].len=w;
    edge[num].next=head[u];
    head[u]=num;
}

bool spfa(long long s)
{
    long long h=1,t=1;
    for(long long i=1;i<=n;i++)
        dis[i]=2147483647;
    dis[s]=0;
    book[s]=1;
    b[t++]=s;
    tim[s]++;
    while(h<t)
    {
        long long x=b[h++];
        book[x]=0;
        if(tim[x]>=n)
            return 1;
        for(long long i=head[x];i;i=edge[i].next)
            if(dis[edge[i].to]>dis[x]+edge[i].len)
            {
                dis[edge[i].to]=dis[x]+edge[i].len;
                if(!book[edge[i].to])
                {
                    b[t++]=edge[i].to;
                    tim[edge[i].to]++;
                    if(tim[edge[i].to]>=n)
                        return 1;
                    book[edge[i].to]=1;
                }
            }
    }
    
    return 0;
}


int main()
{
    int ti;
    cin>>ti;
    while(ti--)
    {
        cin>>n>>m;
        for(long long i=1;i<=m;i++)
        {
            long long u,v,w;
            cin>>u>>v>>w;
            add(u,v,w);
            if(w>=0)
                add(v,u,w);
        }
        
        if(spfa(1))
            cout<<"YE5";
        else
            cout<<"N0";
        cout<<endl;
        sett();
    }

    return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!