洛谷 3385 【模板】负环

SPFA求负环模板(dfs无情被卡掉,老老实实用bfs比较好)

#include <bits/stdc++.h>
#define mem(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
using namespace std;
const int inf = 2147483647;
const int M = 3e5+7;
const int ME = 6e5+7;
int _,n,m,cnt,head[M],vis[M],dis[M],num[M];
struct edge
{
    int v,w,next;
}e[ME];
void init(){
    cnt=0;mem1(head);
}
void add(int u,int v,int w){
    e[++cnt].v=v;e[cnt].w=w;e[cnt].next=head[u];
    head[u]=cnt;
}
int checkspfa(){
    queue<int> q;
    mem(vis);
    for(int i=1;i<=n;i++) dis[i]=inf;    
    num[1]=0;vis[1]=1;dis[1]=0;//初始化
    q.push(1);
    while(!q.empty()){
        int u=q.front();q.pop();
        vis[u]=0;

        for(int i=head[u];~i;i=e[i].next){
            int v=e[i].v,w=e[i].w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    num[v]=num[u]+1;
                    if(num[v]>=n) return 1;//被更新n次
                    q.push(v);vis[v]=1;
                }
            }
        }

    }
    return 0;
}

int main(){
    scanf("%d",&_);
    while(_--){
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            int from,to,val;
            scanf("%d%d%d",&from,&to,&val);
            if(val<0) add(from,to,val);
            else{
                add(from,to,val);add(to,from,val);
            }
        }
        if(checkspfa()) printf("YE5\n");
        else printf("N0\n");
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/LMissher/p/9562990.html