模板 - 負環
阿新 • • 發佈:2019-04-15
spf const clas bit esp add clu 判斷負環 true
SPFA可以用來判斷負環或者計算帶負權的最短路。
其實帶負權的最短路可以用帶勢Dijkstra計算……
所以SPFA基本就拿來判負環了……
#include<bits/stdc++.h> using namespace std; typedef long long ll; namespace SPFA{ const int MAXN=5010; const int MAXM=10010; const int INF=0x3f3f3f3f; int tol; int head[MAXN]; struct Edge{ int to,next,cost; }edge[MAXM]; void init(){ tol=1; memset(head,-1,sizeof(head)); } void add_edge(int u,int v,int cost){ edge[tol].to=v; edge[tol].cost=cost; edge[tol].next=head[u]; head[u]=tol++; } bool vis[MAXN]; int cnt[MAXN]; int dist[MAXN]; bool spfa(int s,int n){ memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); memset(dist,0x3f,sizeof(dist)); queue<int>que; while(!que.empty())que.pop(); que.push(s); vis[s]=true; cnt[s]=1; dist[s]=0; while(!que.empty()){ int u=que.front(); que.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; if(dist[v]>dist[u]+edge[i].cost){ dist[v]=dist[u]+edge[i].cost; if(!vis[v]){ vis[v]=true; que.push(v); if(++cnt[v]>n){ return false; } } } } } return true; } } using namespace SPFA;
模板 - 負環