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; }