裸跑一遍SPFA,统计每个点的入队次数;
如果该点的入队次数>=总点数,那么该点便是一个负环上的点;
重点!!!:
1.不是“YES”,是“YE5”;
2.不是“NO”,是“N0”;(是零);
3.多测不清空,爆零两行泪;
#include <bits/stdc++.h> #pragma GCC optmize(2) using namespace std; int t; int n,m; struct littlestar{ int to; int nxt; int w; }star[600010]; int head[600010],cnt; void add(int u,int v,int w) { star[++cnt].to=v; star[cnt].nxt=head[u]; star[cnt].w=w; head[u]=cnt; } queue<int> q; int dis[600010],vis[600010]; int num[600010]; void SPFA() { memset(num,0,sizeof(num)); memset(vis,0,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); while(q.size()) q.pop(); q.push(1); vis[1]=1; dis[1]=0; while(q.size()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i;i=star[i].nxt){ int v=star[i].to; if(dis[v]>dis[u]+star[i].w){ dis[v]=dis[u]+star[i].w; if(!vis[v]){ vis[v]=1; q.push(v); ++num[v]; if(num[u]>=n){ cout<<"YE5"<<endl; return; } } } } } cout<<"N0"<<endl; return; } int main () { cin>>t; while(t--){ memset(star,0,sizeof(star)); memset(head,0,sizeof(head)); scanf("%d%d",&n,&m); for(register int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); if(w>=0) add(v,u,w); } SPFA(); } return 0; }