Bellman-Ford 最短路径算法
算法证明:http://courses.csail.mit.edu/6.006/spring11/lectures/lec15.pdf
先来看一个这样的图:
这是含有负边权的,如果是用djistra的话将会进行无限次松弛操作。从这里可以看出松弛操作是有一点问题的,如果存在负环,将无止尽的松弛,最短路也就不存在了。还有就是选择不同的遍历顺序对于松弛操作来说是挺重要的。今天就来了解一下聪明的Bellman-Ford算法吧!
Bellman-Ford算法每一轮把边按照一定的顺序,逐条边进行松弛。经过|V|-1轮后,得到的必定是最短路径。
献上松弛操作和Bellman-Ford算法的伪代码:
/*
松弛操作
*/
for v in V:
dist[v] = ∞
dist[s]=
while some edge(u,v) has dist[v]>dist[u]+w(u,v):
pick such an edge(u,v)
relax(u,v):
if dist[v]>dist[u]+w(u,v):
dist[v]=dist[u]+w(u,v) /*
Bellman-Ford
*/
for v in V:
dist[v] = ∞
dist[s]=
for i from to |V|-:
for(u,v)in E:
relax(u,v):
if dist[v]>dist[u]+w(u,v):
dist[v]=dist[u]+w(u,v)
接下来就以上图为例,按照以下顺序处理所有的边:(A,B),(A,C),(B,C),(B,D),(B,E),(E,D),(D,B),(D,C).
然后进行第一次迭代:
最开始dist数组的内容为[0,∞,∞,∞,∞],现在处理(A,B),由于dist[B]=∞,dist[A]+w(A,B)=-1,此时应更新dist[B],即dist为[0,-1,∞,∞,∞]。
同理,按照顺序逐个处理边,将得到以下的dist变化过程:
[0,-1,4,∞,∞] (A,C)
[0,-1,2,∞,∞] (B,C)
[0,-1,2,1,∞] (B,D)
[0,-1,2,1,1] (B,E)
[0,-1,2,-2,1] (E,D)
[0,-1,2,-2,1] (D,B)
[0,-1,2,-2,1] (D,C)
第一轮的最后结果就为上面最后一行,当然了,这个不一定是最优的,因此我们还需要进行下一轮,经过|V-1|次后就一定能求出最短路了。
当然,存在负环是无法得到最短路的,此时只需要在最后进行判断,对每条边都判断以下能不能再进行松弛操作,如果存在可以的边,那就是出现负环了。
Bellman-Ford 最短路径算法的更多相关文章
- 21.boost Ford最短路径算法(效率低)
到某个节点最近距离 最短路径当前节点的父节点 完整代码 #include <iostream> #include <string> #incl ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- Johnson 全源最短路径算法
解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...
- Floyd-Warshall 全源最短路径算法
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- 最短路径算法(II)
什么??你问我为什么不在一篇文章写完所有方法?? Hmm…其实我是想的,但是博皮的加载速度再带上文章超长图片超多的话… 可能这辈子都打不开了吧… 上接https://www.cnblogs.com/U ...
随机推荐
- node.js学习笔记(四)——EventEmitter
error 事件 EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到异常的时候通常会触发 error 事件.当 error 被触发时,EventEmitter ...
- Catlike学习笔记(1.1)-使用Unity实现一个钟表
最近发现『Catlike系列教程』觉得内容真的很赞,感觉有很多地方涉及到了我的知识盲点,如果真的可以照着做下来一遍的话应该收获颇丰.因为教程很长所以逐字翻译不太可能了(主要是翻译的太差).基本上就是把 ...
- LevelDB原理解析
LevelDb有如下一些特点: 首先,LevelDb是一个持久化存储的KV系统,和Redis这种内存型的KV系统不同,LevelDb不会像Redis一样狂吃内存,而是将大部分数据存储到磁盘上. 其次, ...
- 机器学习中几种优化算法的比较(SGD、Momentum、RMSProp、Adam)
有关各种优化算法的详细算法流程和公式可以参考[这篇blog],讲解比较清晰,这里说一下自己对他们之间关系的理解. BGD 与 SGD 首先,最简单的 BGD 以整个训练集的梯度和作为更新方向,缺点是速 ...
- think in UML(二)
基础篇——在学习中思考! 在大概了解了UML之后就该系统的学习UML的主要建模元素了,一个个实例帮助我们更好的理解这些元素的重要性并运用相关知识解决实际问题. 在UML里有一个概念叫版型,有些书里也称 ...
- 第二阶段Sprint9
昨天:重新规划主界面,把视频录制暂放到主页面里 今天:查看有关“共享平台”的资料,看如何实现上传下载功能,并尝试编码, 遇到的问题:看不懂什么意思,照例子做不行,还得需要联网等
- Alpha 冲刺三
团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 发布界面布局完成.登 ...
- PAT 甲级 1105 Spiral Matrix
https://pintia.cn/problem-sets/994805342720868352/problems/994805363117768704 This time your job is ...
- OneZero第四周——预完成功能点统计
本周OneZero将完成“统计”功能. 功能点统计如下: 1.主页单击记录,进入修改界面,修改记录. 2.主页长按记录,出现删除按钮,删除记录. 3.全部记录按分类进行饼图显示. 4.全部记录按分类进 ...
- Java之字节流操作-复制文件
package test_demo.fileoper; import java.io.FileInputStream; import java.io.FileOutputStream; import ...