SPFA算法

匿名 (未验证) 提交于 2019-12-03 00:11:01

定义

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 最短路 }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!