- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最短路径问题—Bellman-Ford算法
最短路径问题—Bellman-Ford算法
一、算法思想
1.Dijkstra算法的局限性
上节介绍了Dijkstra算法,该算法要求网络中各边上得权值大于或等于0.如果有向图中存在带负权值的边,则采用Dijkstra算法求解最短路径得到的结果有可能是错误的。
例如,对下图所示的有向图,采用Dijkstra算法求得顶点v0到顶点v2的最短距离是dist[2],即v0到v2的直接路径,长度为5.但从v0到v2的最短路径应该是(v0,v1,v2),其长度为2。
(a) 有向图 (b) 邻接矩阵
(c) 初始状态 (d) 求出顶点2的最短路径 (e) 求出顶点1的最短路径
图1 有向图中存在带有负权值的边,用Dijkstra算法求解是错误的
如果把图1(a)中的边1,2的权值由-5改成5,则采用Dijkstra算法求解最短路径,得到的结果是正确的(这里不再求解)。
为什么当有向图中存在带负权值的边时,采用Dijkstra算法求解得到的最短路径有时是错误的?答案是:Dijkstra算法在利用顶点u的dist[]去递推T集合各顶点的dist[k]值时,前提是顶点u的dist[]值时当前T集合中最短路径长度最小的。如果图中所有边的权值都是正的,这样推导是没有问题的。但是如果有负权值的边,这样推导是不正确的。例如,在图1(d)中,第1次在T集合中找到dist[]最小的是顶点2,dist[2]等于5;但是顶点0距离顶点2的最短路径是(v0,v1,v2),长度为2,而不是5,其中边1,2是一条负权值边。
2.Bellman-Ford算法思想
为了能够求解边上带有负权值的单源最短路径问题,Bellman(贝尔曼)和Ford(福特)提出了从源点逐次途经其他顶点,以缩短到达终点的最短路径长度的方法。该方法也有一个限制条件:要求图中不能包含权值总和为负值的回路。
例如图2(a)所示的有向图中,回路(v0,v1,v0)包括了一条具有负权值的边,且其路径长度为-1。当选择的路径为(v0,v1,v0,v1,v0,v1,v0,v1,…)时,路径的长度会越来越小,这样顶点0到顶点2的路径长度最短可达-∞。如果存在这样的回路,则不能采用Bellman-Ford算法求解最短路径。
如果有向图中存在由带负权值的边组成的回路,但回路权值总和非负,则不影响Bellman-Ford算法的求解,如图2(b)所示。
(a) 回路权值总和为负 (b) 回路权值总和为正
图2 Bellman-Ford算法:有向图中存在负权值的边
权值总和为负值的回路我们称为负权值回路,在Bellman-Ford算法中判断有向图中是否存在负权值回路的方法,见后面。
假设有向图中有n个不存在负权值回路,从顶点v1和到顶点v25如果存在最短路径,则此路径最多有n-1条边。这是因为如果路径上得边数超过了n-1条时,必然会重复经过一个顶点,形成回路;而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v2的最短路径长度缩短。下面将以此为依据,计算从源点v0到其他每个顶点u的最短路径长度dist[u]。
Bellman-Ford算法构造一个最短路径长度数组序列:dist1[u],dist2[u],dist3[u],…,distn-1[u]。其中:
dist1[u]为从源点v0到终点u的只经过一条边的最短路径的长度,并有dist1[u]=edge[v0,u]。
dist2[u]为从源点v0出发最多经过不构成负权值回路的两条边到达终点u的最短路径长度。
dist3[u]为从源点v0出发最多经过不构成负权值回路的3条边到达终点u的最短路径长度。
……
distn-1[u]为从源点v0出发最多经过不构成负权值回路的n-1条边到达终点u的最短路径长度。
算法的最终目的是计算出distn-1[u],为源点v0到顶点u的最短路径长度。
采用递推方式计算distk[u]。
设已经求出distk-1[u],u=0,1,…,n-1,此即从源点v0最多经过不构成负权值回路的k-1条边到达终点u的最短路径的长度。
从图的邻接矩阵可以找出各个顶点j到达顶点u的(直接边)距离edge[j,u],计算min{distk-1[j]+edge[j,u]},可得从源点v0途经各个顶点,最多经过不构成回路的k条边到达终点u的最短路径的长度。
比较distk-1[u]和min{distk-1[j]+edge[j,u]},取较小者作为distk[u]的值。
因此Bellman-Ford算法的递推公式(求源点v0到各顶点u的最短路径)为:
初始:dist1[u]=edge[v0,u],v0是源点
递推:distk[u]=min{distk-1
您可能关注的文档
最近下载
- 2025年湖北省襄阳市襄阳四中学初三下学期四月调考化学试题含解析.doc VIP
- GBT 42706.1-2023 电子元器件 半导体器件长期贮存 第1部分:总则.doc
- 2018人教版七年级数学下册练习:期末达标检测卷.docx VIP
- AC-25厂拌热再生沥青混凝土试验段施工方案.doc
- 行业联盟与竞争格局演变-深度研究.pptx
- 2024-2025学年北京西城区九年级初三(上)期末道德与法治试卷(含答案).pdf
- 2025年山东省枣庄市滕州市高三二模物理试卷及答案.docx
- 第九章 压强和浮力(知识清单)【教师版】.docx VIP
- 2025保安员理论考试100题(附答案) .pdf VIP
- 2022年三级教育测试题.docx
文档评论(0)