spfa判负环求调 tle
查看原帖
spfa判负环求调 tle
171521
SCWLine楼主2022/5/16 13:03
#include<iostream>
#include<string.h>
#include<queue>
#define INF 0xffff
#define MAX_M 7000
#define MAX_N 2000
using namespace std;

int n,m;
//global

struct edge
{
    int v,w;
    int next;
    void init(int _v,int _w,int _n)
    {
        v=_v,w=_w,next=_n;
    }
}e[MAX_M];
int head[MAX_N];
int cnt;

void add(int u,int v,int w)
{
    cnt++;
    e[cnt].init(v,w,head[u]);
    head[u]=cnt;
}

//edge

bool s_vis[MAX_N];
int s_dis[MAX_N];
int s_t[MAX_N];

bool spfa(int s)
{
    queue<int> q;
    memset(s_vis,false,sizeof(s_vis));
    memset(s_t,0,sizeof(s_t));
    for(int i=0;i<=n;i++)
        s_dis[i]=INF;

    q.push(s);
    s_t[s]++;
    s_vis[s]=true;
    s_dis[s]=0;

    while(!q.empty())
    {
        int u=q.front();
        s_vis[u]=false;
        q.pop();

        for(int i=head[u];i;i=e[u].next)
        {
            int v=e[i].v;
            if(s_dis[v]>s_dis[u]+e[i].w)
            {
                s_dis[v]=s_dis[u]+e[i].w;
                if(!s_vis[v])
                {
                    s_vis[v]=true;
                    q.push(v);
                    s_t[v]++;
                    if(s_t[v]>n)
                        return true;
                }
            }

        }
    }
    return false;
}
//spfa part

int main()
{
    int t;
    cin>>t;
    for(int pz=0;pz<t;pz++)
    {
        cin>>n>>m;
        memset(head,0,sizeof(head));
        cnt=0;
        for(int i=0;i<m;i++)
        {
            int t1,t2,t3;
            cin>>t1>>t2>>t3;
            add(t1,t2,t3);
            if(t3>=0)   
                add(t2,t1,t3);
        }

        cout<<(spfa(1)?"NO":"YES")<<endl;
    }

    return 0;
}
2022/5/16 13:03
加载中...