acwing852spfa判断负环,SPFA(模板)
可直接套用acwing851的模子
#include <bits/stdc++.h> using namespace std; int n,m,a,b,c; const int N=100005; int e[N],ne[N],w[N],h[N],idx; int dist[N],cnt[N]; bool st[N]; queue<int> q; bool spfa(){ memset(dist,0x3f,sizeof(dist)); dist[1]=0; for(int i=1;i<=n;i++) q.push(i),st[i]=true; while(q.size()){ int top=q.front(); q.pop(); st[top]=false; for(int i=h[top];i!=-1;i=ne[i]){ int pt=e[i]; if(dist[pt]>dist[top]+w[i]){ dist[pt]=dist[top]+w[i]; cnt[pt]=cnt[top]+1; if(cnt[pt]>=n) return true; if(!st[pt]){ q.push(pt); st[pt]=true; } } } } return false; } int main(int argc, char** argv) { cin>>n>>m; memset(h,-1,sizeof h); for(int i=0;i<m;i++){ cin>>a>>b>>c; e[i]=b, w[i]=c, ne[i]=h[a], h[a]=i; } if(spfa()) puts("Yes"); else puts("No"); return 0; }但由于是找图内的负圈所以一开始可以把所以点放进队列内
#include <bits/stdc++.h> using namespace std; int n,m,a,b,c; const int N=20005; int e[N],ne[N],w[N],h[N],idx; int dist[N],cnt[N]; bool st[N]; queue<int> q; bool spfa(){ memset(dist,0x3f,sizeof(dist)); dist[1]=0; for(int i=1;i<=n;i++) q.push(i),st[i]=true; while(q.size()){ int top=q.front(); q.pop(); st[top]=false; for(int i=h[top];i!=-1;i=ne[i]){ int pt=e[i]; if(dist[pt]>dist[top]+w[i]){ dist[pt]=dist[top]+w[i]; cnt[pt]=cnt[top]+1; if(cnt[pt]>=n) return true; if(!st[pt]){ q.push(pt); st[pt]=true; } } } } return false; } int main(int argc, char** argv) { cin>>n>>m; memset(h,-1,sizeof h); for(int i=0;i<m;i++){ cin>>a>>b>>c; e[i]=b, w[i]=c, ne[i]=h[a], h[a]=i; } if(spfa()) puts("Yes"); else puts("No"); return 0; }