网站大量收购独家精品文档,联系QQ:2885784924

最短路径问题—Bellman-Ford算法.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

153****9595 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档