博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图论算法——SPFA算法
阅读量:4635 次
发布时间:2019-06-09

本文共 1623 字,大约阅读时间需要 5 分钟。

SPFA算法是单源最短路径的最快算法,时间复杂度是O(KE)K一般为1或2,E是边数,就算他O(E)好了。

SPFA在很多教科书上都没有,主要是因为SPFA是中国人提出来的,外国人很少知道,所以就没有Dijkstra拿下算法那么热门,虽然不是很热门,但算法本身还是很好的。
SPFA是Bellman-ford的优化版,单源最短路径,可以检查出有没有负权环,最重要的是没有Dijkstra那么好卡。
SPFA主要是考虑到Bellman-ford的松弛操作有很多多余的地方,就用队列把那些多余的地方去掉了。
SPFA的算法过程是:
0、先说明一下,dist[i]表示从s到i的最短路径,map[i][j]表示从i到j这条路的权值,s表示起点,cmp[i]为i入队了多少次。
1、初始化:把dist数组设为无穷大,把dist[s]设为0,map[i][j]里,如果走得到,就放ij这条边的权值,走不到就置成INF(INF为无穷大)。
2、设一个队列q,s入队。
3、取出队列的第一个元素,用这个元素来松弛其他元素,也就是:

if(dist[v]+temp.second
=n){std::cout<<-inf;return 0;} }

这里用了STL的queue,和STL的pair,queue相信大家都知道,但pair知道的人就很少了,你暂且可以把它理解为一个储存两个元素的容器,XXX.first为第一个元素,XXX.second为第二个元素。

如果你想了解有关STL的pair的更多更多请访问:或
如果你想了解更过有关STL的queue请访问:或
4、如果队列为空,那么结束循环,表示SPFA算法已结束,跳到7
5、如果某个节点进队列超过n(节点数)次,就表示有负权环,输出“有负权环”,程序结束。
6、跳到3
7、输出,结束程序。
然后是上代码:

#include
#include
#include
#include
#include
#include
#include
#include
int dist[1001],cmp[1001];std::vector< std::list< std::pair
> > map1;std::queue
q;const int inf = 0x3f3f3f3f;int main(){ int n,m,a,b,c,s; std::cin>>n>>m>>s; map1.resize(n+1); s--; for(int i = 0;i
>a>>b>>c; a--;b--; std::pair
temp (b,c); map1[a].push_back(temp); } memset(dist,0x3f,sizeof(dist)); dist[s] = 0; q.push(s);cmp[s]++; while(1) { int v = q.front();q.pop(); for(std::list< std::pair
>::iterator it = map1[v].begin();it!=map1[v].end();it++) { std::pair
temp = *it; if(dist[v]+temp.second
=n){ std::cout<<-inf;return 0;} } } if(q.empty()==true)break; } for(int i = 0;i

转载于:https://www.cnblogs.com/powerLEO101/p/7695195.html

你可能感兴趣的文章
【MFC】vs2013_MFC使用文件之15.mfc 按钮CBitmapButton的使用
查看>>
QGLViewer 编译安装步骤
查看>>
配置Mysql实现主从复制与读写分离
查看>>
易货Beta版本发布说明
查看>>
textbox 和textera 文本框多行后不能拉伸
查看>>
mingw + msys 上编译 ffmpeg
查看>>
使用Mule ESB与Groovy编排RESTful服务【转】很适合我们当前的架构
查看>>
PHP多线程的实现(PHP多线程类)
查看>>
k8s实战之从私有仓库拉取镜像 - kubernetes
查看>>
centos7硬盘分区
查看>>
chrome扩展之3:一步步跟我学开发一个表单填写扩展
查看>>
Socket、Http、TCP/IP、UDP的联系与区别
查看>>
包装函数
查看>>
原理系列:Spark1.x 生态圈一览
查看>>
django模板系统(下)
查看>>
HDU 1711 Number Sequence(KMP模板)
查看>>
如何查看Ubuntu版本
查看>>
本杰明 富兰克林 道德13准则
查看>>
JAVA 操作系统已经来到第五个版本了 现陆续放出三个版本 这是第二个版本
查看>>
LightOJ 1370 Bi-shoe and Phi-shoe(欧拉函数)
查看>>