定义
SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。
原理
动态逼近法:
如果某个点进入队列的次数超过 N 次则存在负环。
实现
代码
#include<bits/stdc++.h> using namespace std; const int maxn=1005; const int inf=0x3f3f3f3f; struct node { int v,w; node(){} node(int a,int b) {v=a;w=b;} }; int n,m; vector<node> e[maxn]; void SPFA(int s); int main() { int i,u,v,w; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); e[u].push_back(node(v,w)); } SPFA(1); system("pause"); return 0; } void SPFA(int s) { int i,p,v,w,dis[maxn],vis[maxn]={0},cnt[maxn]={0}; queue<int> que; fill(dis,dis+maxn,inf); que.push(s); dis[s]=0; while(!que.empty()) { p=que.front();que.pop(); cnt[p]++; if(cnt[p]==n+1) //有环 {printf("有环\n");return ;} for(i=0;i<e[p].size();i++) { v=e[p][i].v; w=e[p][i].w; if(dis[v]>dis[p]+w) { dis[v]=dis[p]+w; if(!vis[v]) { vis[v]=1; que.push(v); } } } } printf("%d\n",dis[n]); //1->n 最短路 }
来源:博客园
作者:Vivid-BinGo
链接:https://www.cnblogs.com/VividBinGo/p/11597415.html