Spfa模板
来源:互联网 发布:淘宝网的地位和特点 编辑:程序博客网 时间:2024/06/13 00:10
#include<iostream>#include<cstring>#include<queue>using namespace std;const int MAXN=100002,MAXM=2000005,INF=0x7fffffff,Qsize=MAXN;int N,M,S,T;struct Edge //使用数组模拟邻接表存储边信息{ int u,v,c;}E[MAXM];int fir[MAXN],next[MAXM],tot = 0;int dist[MAXN];queue<int>q;int cnt[MAXN];bool f[MAXN];void Add_Edge(int u,int v,int c){ E[tot].u=u;E[tot].v=v;E[tot].c=c; next[tot]=fir[u],fir[v]=tot++;}void init(){ cin>>N>>M>>S>>T; memset(fir, -1, sizeof(fir)); for(int i=1;i<=M;i++) { int u,v,c; cin>>u>>v>>c; Add_Edge(u,v,c); Add_Edge(u,v,c); //如果为有向图则不加此句 }}bool spfa(){ for(int i=1;i<=N;i++) //初始化距离 dist[i]=INF; dist[S]=0; q.push(S);f[S]=0; while(q.size()) { int u=q.front(),v; //取出队首元素 q.pop(); for(int i=fir[u]; ~i; i=next[i]) //枚举其每条出边进行松弛 { v=E[i].v; if(dist[u]+E[i].c < dist[v]) { dist[v]=dist[u]+E[i].c; if(f[v] == 0) { f[v]=1; q.push(v); } cnt[v]++; //记录每个点入队次数 if(cnt[v]>N) return false; //如果某个点入队超过N次,则有负环 } } f[u]=0; } return true;}int main(){ init(); if(spfa()) cout<<dist[T]<<endl; else cout<<"-INF"<<endl; return 0;}