最短路算法及其应用(2006冬令营)
最短路问题的求解方法

最短路问题的求解方法最短路问题是图论中的一个经典问题,它在很多实际应用中都有着重要的作用。
在现实生活中,我们经常需要求解最短路径,比如在地图导航、网络通信、交通运输等领域。
因此,研究最短路问题的求解方法具有重要的理论意义和实际应用价值。
在图论中,最短路问题的求解方法有很多种,其中比较经典的有Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法等。
这些算法各有特点,适用于不同的场景和要求。
下面我们就逐一介绍这些算法的原理和求解方法。
Dijkstra算法是一种用于求解单源最短路径的算法,它采用贪心策略,每次找到当前距离最短的节点进行松弛操作,直到所有节点都被遍历。
Dijkstra算法的时间复杂度为O(V^2),其中V为节点的个数。
这种算法适用于边权值为正的图,可以求解从单个源点到其他所有点的最短路径。
Bellman-Ford算法是一种用于求解单源最短路径的算法,它可以处理边权值为负的图,并且可以检测负权回路。
Bellman-Ford算法的时间复杂度为O(VE),其中V为节点的个数,E为边的个数。
这种算法适用于一般情况下的最短路径求解,但是由于其时间复杂度较高,不适用于大规模图的求解。
Floyd-Warshall算法是一种用于求解所有点对最短路径的算法,它可以处理边权值为正或负的图,但是不能检测负权回路。
Floyd-Warshall算法的时间复杂度为O(V^3),其中V为节点的个数。
这种算法适用于求解图中所有点对之间的最短路径,可以同时求解多个源点到多个目标点的最短路径。
除了上述几种经典的最短路求解算法外,还有一些其他的方法,比如A算法、SPFA算法等。
这些算法在不同的场景和要求下有着各自的优势和局限性,需要根据具体情况进行选择和应用。
在实际应用中,最短路问题的求解方法需要根据具体的场景和要求进行选择,需要综合考虑图的规模、边权值的情况、时间效率等因素。
同时,对于大规模图的求解,还需要考虑算法的优化和并行化问题,以提高求解效率。
最短路算法[1]
![最短路算法[1]](https://img.taocdn.com/s3/m/12faba0876c66137ee061915.png)
最短路算法及其应用广东北江中学余远铭【摘要】最短路问题是图论中的核心问题之一,它是许多更深层算法的基础。
同时,该问题有着大量的生产实际的背景。
不少问题从表面上看与最短路问题没有什么关系,却也可以归结为最短路问题。
本文较详尽地介绍了相关的基本概念、常用算法及其适用范围,并对其应用做出了举例说明,侧重于模型的建立、思考和证明的过程,最后作出总结。
【关键字】最短路【目录】一、基本概念 (2)1.1 定义 (2)1.2简单变体 (2)1.3负权边 (3)1.4重要性质及松弛技术 (4)二、常用算法 (5)2.1 Dijkstra算法 (5)2.2 Bellman-Ford算法 (7)2.3 SPFA算法 (8)三、应用举例 (10)3.1 例题1——货币兑换 (10)3.2 例题2——双调路径 (11)3.3 例题3——Layout (13)3.4 例题4——网络提速 (15)四、总结 (18)【正文】一、基本概念1.1 定义乘汽车旅行的人总希望找出到目的地尽可能短的行程。
如果有一张地图并在地图上标出了每对十字路口之间的距离,如何找出这一最短行程?一种可能的方法是枚举出所有路径,并计算出每条路径的长度,然后选择最短的一条。
然而我们很容易看到,即使不考虑含回路的路径,依然存在数以百万计的行车路线,而其中绝大多数是没必要考虑的。
下面我们将阐明如何有效地解决这类问题。
在最短路问题中,给出的是一有向加权图G=(V ,E),在其上定义的加权函数W:E →R 为从边到实型权值的映射。
路径P=(v 0, v 1,……, v k )的权是指其组成边的所有权值之和:11()(,)ki i i w p w v v -==∑定义u 到v 间最短路径的权为{}{}min ():)w p u v u v v δυ→(,=∞ 如果存在由到的通路如果不存在从结点u 到结点v 的最短路径定义为权())w p v δυ=(,的任何路径。
noip不会做咋办,快用骗分导论,高效得分

noip不会做咋办,快用骗分导论,高效得分【1】遇到难题时心态要稳定,先搞定简单的题目,最后思考难题。
心态是第一位。
【2】如果难题实在不能解决也不能放弃,虽然写不出完美的算法,但可以用象贪心,搜索之类的算法,虽然不能AC 但一般能过几个,有分总比没分好。
举个例子例如下图中,存在3 个磁场,白点表示机器人的位置,黑点表示矿石的穿越磁场(cross)探险机器人在Samuel 星球上寻找一块奇特的矿石,然而此时它陷入了一片神秘的磁场区域,动弹不得。
探险空间站立刻扫描了这片区域,绘制出该区域的磁场分布平面图。
这片区域中分布了N 个磁场,每个磁场呈正方形,且边与坐标轴平行。
位置:科学家们分析平面图,进一步发现:这些磁场为大小不一的正方形,可能相交,甚至覆盖,但是它们的边缘不会重合,顶点也不会重合。
例如下面的两种情形是不会出现的:科学家们给探险机器人启动了磁力罩,这样它就可以在磁场中自由穿越了。
初始时,探险机器人和所有矿石都不在任何磁场的边缘。
由于技术限制,XYO3在穿越过程中机器人只能够水平或垂直移动,且不能够沿着磁场的边缘行动。
由于磁力罩的能量有限,科学家们希望探险机器人穿越尽量少的磁场边缘采集到这块矿石。
例如上图中,探险机器人最少需要穿越两次磁场边缘。
现在小联请你编写程序,帮助科学家们设计探险机器人的路线,统计探险机器人最少需要穿越多少次磁场边缘。
输入(CROSS.IN):第一行有一个整数N,表示有N 个磁场(1 < N < 100)。
随后有N 行,每行有三个整数X、Y、C(0 < X ,Y ,C < 10000),表示一个磁场左下角坐标为(X,Y),边长为C。
接下来有一行,共有四个整数SX, SY, TX,TY,表示机器人初始坐标为(SX, SY),矿石坐标为(TX,TY)(其中,0 < S X,SY, TX, TY < 10000)。
输出(CROSS.OUT):单行输出一个整数,表示机器人最少需要穿越多少次磁场边缘。
最短路问题及其应用——最短路径

最短路问题及应用摘要:主要介绍最短路的两种算法,迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法以及这两种算法在实际问题中的应用和比较。
关键词:最短路获克斯特拉(Dijkstra),弗罗伊德(Floyd)算法1.引言图论是应用数学的一个分支,它的概念和结果来源非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的哥尼斯堡七桥问题,以及在民间广泛流传的一些游戏难题,如迷宫问题、博弈问题、棋盘上马的行走路线问题等。
这些古老的难题,当时吸引了很多学者的注意。
在这些问题研究的基础上又继续提出了著名的四色猜想和汉米尔顿(环游世界)数学难题。
1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出越来越大的作用在实践中,图论已成为解决自然科学、工程技术、社会科学、军事等领域中许多问题的有力工具之一。
最短路问题是图论理论的一个经典问题。
寻找最短路径就是在指定网络中两结点间找一条距离最小的路。
最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量,如时间、费用、线路容量等。
最短路径算法的选择与实现是通道路线设计的基础,最短路径算法是计算机科学与地理信息科学等领域的研究热点,很多网络相关问题均可纳入最短路径问题的范畴之中。
经典的图论与不断发展完善的计算机数据结构及算法的有效结合使得新的最短路径算法不断涌现。
2.最短路算法2.1 最短路的定义对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图()0w≥的有效算法是由荷兰著名计算机专家E.W.Dijkstra在1959年首次提出的,该ij算法能够解决两指定点间的最短路,也可以求解图G中一特定点到其它各顶点的最短路。
后来海斯在Dijkstra 算法的基础之上提出了海斯算法。
但这两种算法都不能解决含有负权的图的最短路问题。
最短路算法(bellman-Ford算法)

最短路算法(bellman-Ford算法)贝尔曼-福特算法与迪科斯彻算法类似,都以松弛操作为基础,即估计的最短路径值渐渐地被更加准确的值替代,直⾄得到最优解。
在两个算法中,计算时每个边之间的估计距离值都⽐真实值⼤,并且被新找到路径的最⼩长度替代。
然⽽,迪科斯彻算法以贪⼼法选取未被处理的具有最⼩权值的节点,然后对其的出边进⾏松弛操作;⽽贝尔曼-福特算法简单地对所有边进⾏松弛操作,共|V | − 1次,其中 |V |是图的点的数量。
在重复地计算中,已计算得到正确的距离的边的数量不断增加,直到所有边都计算得到了正确的路径。
这样的策略使得贝尔曼-福特算法⽐迪科斯彻算法适⽤于更多种类的输⼊。
贝尔曼-福特算法的最多运⾏O(|V|·|E|)次,|V|和|E|分别是节点和边的数量)。
贝尔曼-福特算法与迪科斯彻算法最⼤的不同:bellman-Ford算法可以存在负权边,⽽dijkstra算法不允许出现负权边;bellman-Ford算法的步骤: 步骤1:初始化图 步骤2 :对每⼀条边进⾏松弛操作 步骤3:检查负权环procedure BellmanFord(list vertices, list edges, vertex source)// 该实现读⼊边和节点的列表,并向两个数组(distance和predecessor)中写⼊最短路径信息// 步骤1:初始化图for each vertex v in vertices:if v is source then distance[v] := 0else distance[v] := infinitypredecessor[v] := null// 步骤2:重复对每⼀条边进⾏松弛操作for i from1 to size(vertices)-1:for each edge (u, v) with weight w in edges:if distance[u] + w < distance[v]:distance[v] := distance[u] + wpredecessor[v] := u// 步骤3:检查负权环for each edge (u, v) with weight w in edges:if distance[u] + w < distance[v]:error "图包含了负权环"View Code题意:John在N个农场之间有path与wormhole ,path+时间,wormhole-时间;求是否存在某点满⾜,John 旅⾏⼀些 paths和wormholes,回到原点时间为负。
最短路问题的知识表示方法

最短路问题的知识表示方法最短路问题的知识表示引言最短路问题是图论中的经典问题之一,其目标是找出两个节点之间的最短路径。
本文将介绍最短路问题的知识表示,并详细讨论各种解决方法。
单源最短路问题Dijkstra算法•Dijkstra算法是解决单源最短路问题的经典算法之一。
•算法使用了贪心策略,逐步确定每个节点的最短距离。
•算法的时间复杂度为O(V^2),其中V表示图中的节点数。
Bellman-Ford算法•Bellman-Ford算法是解决单源最短路问题的另一种常用算法。
•算法通过对边进行松弛操作,找出最短路径。
•Bellman-Ford算法可以处理带有负权边的图。
•算法的时间复杂度为O(VE),其中V表示图中的节点数,E表示图中的边数。
多源最短路问题Floyd-Warshall算法•Floyd-Warshall算法是解决多源最短路问题的经典算法之一。
•算法通过动态规划的方式,逐步更新节点之间的最短距离。
•算法的时间复杂度为O(V^3),其中V表示图中的节点数。
Johnson算法•Johnson算法是解决多源最短路问题的另一种常用算法。
•算法通过引入一个虚拟节点,将图中的负权边转化为非负权边的形式。
•算法的时间复杂度为O(VE + V^2logV),其中V表示图中的节点数,E表示图中的边数。
应用领域•最短路问题在计算机网络中广泛应用,用于寻找数据包的最优路径。
•在交通运输领域,最短路问题被用于规划最短路径,提高运输效率。
•最短路问题还被应用于物流配送、电力网络等领域中。
总结最短路问题是图论中的重要问题,有多种解决方法。
本文介绍了单源最短路问题和多源最短路问题的几种经典算法,并讨论了它们的应用领域。
了解最短路问题的知识表示,可以为解决实际问题提供参考和指导。
算法合集之《最短路算法及其应用》

SPFA算法
我们用数组d记录每个结点的最短路径估计值,而且用邻接表 来存储图G。我们采取的方法是动态逼近法:
设立一个先进先出的队列用来保存待优化的结点,优化时每次 取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向 的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点 不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点 来进行松弛操作,直至队列空为止。
定义
在最短路问题中,给出的是一有向加权图 G=(V,E),在其上定义的加权函数W:E→R为从 边到实型权值的映射。路径P=(v0, v1,……, vk) 的权是指其组成边的所有权值之和:
w( p)
w(v
i 1
k
i 1
, vi )
定义u到v间最短路径的权为:
v)
minw( p ):u v 如果存在由u到v的通路 如果不存在
14
在最短路径表中,e,g的最短路径估值又变小,队列中无e点,e入队,队列 中存在g这个点,g不用入队,此时队列中元素为g,e 队首元素g点出队,对以g为起始点的所有边的终点依次进行松弛操作(此 处只有b点),此时路径表格状态为:
a d[i] 0
b
c
d
e
f
g 14
17 8
15 13 11
在最短路径表中,b的最短路径估值又变小,队列中无b点,b入队,此时队列 中元素为e,b
推论
推论1.1 给定有向加权图G=(V,E),源点为s,则对 于所有边(u,v) E,有:
(s, v) (s, u) w(u, v)
证明: 从源点s到结点v的最短路径P的权不大于 从s到v的其它路径的权。特别地,路径P的权也不大 于某特定路径的权,该特定路径为从s到u的最短路径 加上边(u,v)。(证毕)
最短路算法

一 、狄克斯特拉算法 (Dijkstra algorithm, 1959)
• 计算两节点之间或一个节点到所有节点之间的最短路
的直接距离(两点之间有边 两点之间有边), 令 dij 表示 vi 到 vj 的直接距离 两点之间有边 ,若两点之间 没有边, 两点之间是有向边, 没有边,则令 dij = ∞,若两点之间是有向边,则 dji = ∞; 令 dii = 0,s 表示始点,t 表示终点 , 表示始点,
j dij i dik djk k
4
6.3.2 Floyd-Warshall 算法 (1962) for i=1 to n do dii=∞; ∞ for all eij=0; for j=1 to n do for i=1 to n do if i≠j then ≠ for k=1 to n do if k≠j then ≠ begin dik=min{dik, dij+djk}; if dik>dij+djk then eik=j end;
1
例1 狄克斯特拉算法 ∞ 10 11 ∞
2 10
0 s
1 8 9 3 4
12 15 ∞
5 20 2 2 30
∞ t 31
பைடு நூலகம்15
8 4 ∞ 8
7
6
13 ∞ 15
2
Dijkstra最短路算法的特点和适应范围 最短路算法的特点和 最短路算法的特点
• 一种隐阶段的动态规划方法 • 每次迭代只有一个节点获得永久标记,若有两个或两个以上 每次迭代只有一个节点获得永久标记, 节点的临时标记同时最小,可任选一个永久标记;总是从一 节点的临时标记同时最小,可任选一个永久标记; 个新的永久标记开始新一轮的临时标记,是一种深探法 个新的永久标记开始新一轮的临时标记,是一种深探法 • 被框住的永久标记 Tj 表示 vs 到 vj 的最短路,因此 要求 dij≥0, 的最短路, , 次迭代得到的永久标记, 条边, 第 k 次迭代得到的永久标记,其最短路中最多有 k 条边,因 此最多有n 此最多有 −1 次迭代 • 可以应用于简单有向图和混合图,在临时标记时,所谓相邻 可以应用于简单有向图和混合图 在临时标记时, 简单有向图和混合图, 必须是箭头指向的节点; 必须是箭头指向的节点;若第 n−1 次迭代后仍有节点的标记 为 ∞,则表明 vs 到该节点无有向路径 • 如果只求 vs 到 vt 的最短路,则当 vt 得到永久标记算法就结束 的最短路, 了;但算法复杂度是一样的 • 应用 Dijkstra 算法 n−1 次 ,可以求所有点间的最短路 • vs 到所有点的最短路也是一棵生成树,但不是最小生成树 到所有点的最短路也是一棵生成树,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最短路算法及其应用广东北江中学余远铭【摘要】最短路问题是图论中的核心问题之一,它是许多更深层算法的基础。
同时,该问题有着大量的生产实际的背景。
不少问题从表面上看与最短路问题没有什么关系,却也可以归结为最短路问题。
本文较详尽地介绍了相关的基本概念、常用算法及其适用范围,并对其应用做出了举例说明,侧重于模型的建立、思考和证明的过程,最后作出总结。
【关键字】最短路【目录】一、基本概念 (2)1.1 定义 (2)1.2简单变体 (2)1.3负权边 (3)1.4重要性质及松弛技术 (4)二、常用算法 (5)2.1 Dijkstra算法 (5)2.2 Bellman-Ford算法 (7)2.3 SPFA算法 (8)三、应用举例 (10)3.1 例题1——货币兑换 (10)3.2 例题2——双调路径 (11)3.3 例题3——Layout (13)3.4 例题4——网络提速 (15)四、总结 (18)【正文】一、基本概念1.1 定义乘汽车旅行的人总希望找出到目的地尽可能短的行程。
如果有一张地图并在地图上标出了每对十字路口之间的距离,如何找出这一最短行程?一种可能的方法是枚举出所有路径,并计算出每条路径的长度,然后选择最短的一条。
然而我们很容易看到,即使不考虑含回路的路径,依然存在数以百万计的行车路线,而其中绝大多数是没必要考虑的。
下面我们将阐明如何有效地解决这类问题。
在最短路问题中,给出的是一有向加权图G=(V ,E),在其上定义的加权函数W:E →R 为从边到实型权值的映射。
路径P=(v 0, v 1,……, v k )的权是指其组成边的所有权值之和:11()(,)ki i i w p w v v -==∑定义u 到v 间最短路径的权为{}{}min ():)w p u v u v v δυ→(,=∞ 如果存在由到的通路如果不存在从结点u 到结点v 的最短路径定义为权())w p v δυ=(,的任何路径。
在乘车旅行的例子中,我们可以把公路地图模型化为一个图:结点表示路口,边表示连接两个路口的公路,边权表示公路的长度。
我们的目标是从起点出发找一条到达目的地的最短路径。
边的权常被解释为一种度量方法,而不仅仅是距离。
它们常常被用来表示时间、金钱、罚款、损失或任何其他沿路径线性积累的数量形式。
1.2简单变体单目标最短路径问题: 找出从每一结点v 到某指定结点u 的一条最短路径。
把图中的每条边反向,我们就可以把这一问题转化为单源最短路径问题。
单对结点间的最短路径问题:对于某给定结点u 和v ,找出从u 到v 的一条最短路径。
如果我们解决了源结点为u 的单源问题,则这一问题也就获得了解决。
对于该问题的最坏情况,从渐进意义上看,目前还未发现比最好的单源算法更快的方法。
每对结点间的最短路径问题:对于每对结点u 和v ,找出从u 到v 的最短路径。
我们可以用单源算法对每个结点作为源点运行一次就可以解决问题。
1.3负权边在某些单源最短路问题中,可能存在权为负的边。
如果图G(V ,E)不包含由源s 可达的负权回路,则对所有s v V ∈,最短路径的权的定义(,)s v δ依然正确。
即使它是一个负值也是如此。
但如果存在一从s 可达的负权回路,最短路径的定义就不能成立了。
从s 到该回路上的结点不存在最短路径——因为我们总可以顺着找出的“最短”路径再穿过负权回路从而获得一权值更小的路径,因此如果从s 到v 的某路径中存在一负权回路,我们定义(,)s v δ=-∞。
图1 含有负权和负权回路的图图1说明负的权值对最短路径的权的影响。
每个结点内的数字是从源点s 到该结点的最短路径的权。
因为从s 到a 只存在一条路径(路径<s,a>),所以:(,)(,)3s a w s a δ==。
类似地,从s 到b 也只有一条通路,所以:(,)(,)(,)3(4)1s b w s a w a b δ=+=+-=-。
从s 到c 则存在无数条路径:<s,c>,<s,c,d,c>,<s,c,d,c,c,d,c>等等。
因为回路<c,d,c>的权为6+(-3)=3>0,所以从s 到c 的最短路径为<s,c>,其权为:(,)5s c δ=。
类似地,从s 到d 的最短路径为<s,c,d>,其权为:(,)(,)(,)11s d w s c w c d δ=+=。
同样,从s 到e 存在无数条路径:<s,e>,<s,e,f,e>,<s,e,f,e,f,e>等等.由于回路<e,f,e>的权为3+(-6)=-3<0,所以从s 到e 没有最短路径。
只要穿越负权回路任意次,我们就可以发现从s 到e 的路径可以有任意小的负权值,所以:(,)s e δ=-∞类似地,(,)s f δ=-∞因为g 是从f 可达的结点,我们从s 到g 的路径可以有任意小的负权值,则:(,)s g δ=-∞。
结点h ,j ,i 也形成一权值为负的回路,但因为它们从s 不可达,因此(,)(,)(,)s h s i s j δδδ===∞。
一些最短路径的算法,例如Dijkstra 算法,都假定输入图中所有边的权取非负数,如公路地图实例。
另外一些最短路算法,如Bellman-Ford 算法,允许输入图中存在权为负的边,只要不存在从源点可达的权为负的回路,这些算法都能给出正确的解答。
特定地说,如果存在这样一个权为负的回路,这些算法可以检测出这种回路的存在。
1.4重要性质及松弛技术本文的算法所运用的主要技术是松弛技术,它反复减小每个结点的实际最短路径的权的上限,直到该上限等于最短路径的权。
让我们看看如何运用松弛技术并正式证明它的一些特性。
定理1 (最优子结构) 给定有向加权图G=(V ,E),设P=<v 1, v 2,…, v k >为从结点v 1到结点v k 的一条最短路径,对任意i,j 有i<=j<=k ,设P ij =< v i , v i+1,…, v j >为从v i 到v j 的P 的子路径,则P ij 是从v i 到v j 的一条最短路径。
证明:我们把路径P 分解为<v 1,v 2,…,v i ,v i+1,…v j ,…v k >。
则w(P)=w(P 1i )+w(P ij )+w(P jk )。
现在假设从v i 到v j 存在一路径P ’ij ,且w(P ’ij )<w(P ij ),则将P 中的路径P ij =(v i ,v i+1,…v j )替换成P ’ij ,依然是从v 1到v k 的一条路径,且其权值 w(P 1i )+w(P ’ij )+w(P jk )小于w(P),这与前提P 是从v 1到v k 的最短路径矛盾。
(证毕)下面看定理1的一个推论,它给出了最短路径的一个简单而实用的性质: 推论1.1 给定有向加权图G=(V ,E),源点为s ,则对于所有边(u,v)⊂E ,有(,)(,)(,)s v s u w u v δδ≤+证明: 从源点s 到结点v 的最短路径P 的权不大于从s 到v 的其它路径的权。
特别地,路径P 的权也不大于某特定路径的权,该特定路径为从s 到u 的最短路径加上边(u,v)。
(证毕)下面介绍松弛技术。
对每个结点v ∈V ,我们设置一属性d[v]来描述从源s 到v 的最短路径的权的上界,称之为最短路径估计。
我们通过下面的过程对最短路径估计和先辈初始化。
经过初始化以后,对所有v ∈V ,π[v]=NIL ,对v=s ,d[v]=0,对v ∈V-{s},INITIALIZE-SINGLE-SOURCE(G ,s) 1. For 每个结点 v ∈V[G] 2. Do d[v]←∞ 3. π[v]←NIL 4. d[s]←0d[v]= ∞。
松弛一条边(u,v)的过程包括测试我们是否可能通过结点u对目前找出的到v的最短路径进行改进,如果可能则更新d[v]和π[v],一次松弛操作可以减小最短路径的估计值d[v]并更新v的先辈域π[v],下面的代码实现了对边(u,v)的进一步松弛操作。
RELAX(u,v,w)1.If d[v]>d[u]+w(u,v)2.Then d[v]←d[u]+w(u,v)3.π[v]←u图2 对边(u,v)进行松弛图2说明了松弛一条边的两个实例,在其中一个例子中最短路径估计减小,而在另一实例中最短路径估计不变。
(a)因为在进行松弛以前d[v]>d[u]+w[u,v],所以d[v]的值减小。
(b)因为松弛前d[v]<=d[u]+w[u,v],所以松弛不改变d[v]得值。
下文介绍的每个算法都调用INITIALIZE-SINGLE-SOURCE,然后重复对边进行松弛的过程RELAX。
区别在于对每条边进行松弛操作的次数以及对边执行操作的次序有所不同。
需要指出的是,松弛是改变最短路径估计和先辈的唯一方式。
二、常用算法这一节着重讨论两种常用算法:Dijkstra算法和Bellman-Ford算法。
虽然它们都是建立在松弛技术基础上的算法,但是在实现上有着各自的特点,适用的范围也有所不同。
另外,我们还将介绍一种期望复杂度与边数同阶的高效算法——SPFA算法,并对其复杂度作出简要的分析。
2.1 Dijkstra算法Dijkstra算法解决了有向加权图的最短路径问题,该算法的条件是该图所有边的权值非负,因此在本小节我们约定:对于每条边(u,v)∈E,w(u,v)>=0。
Dijkstra算法中设置了一结点集合S,从源结点s到集合S中结点的最终最短路径的权均已确定,即对所有结点v∈S,有d[v]=δ(s,v)。
算法反复挑选出其最短路径估计为最小的结点u∈V-S,把u插入集合S中,并对离开u 的所有边进行松弛。
在下列算法实现中设置了优先队列Q,该队列包含所有属于V-S的结点,且队列中各结点都有相应的d值。
算法假定图G由临接表表示。
Dijkstra(G,w,s)1.INITIALIZE-SINGLE-SOURCE(G,S)2.S←∅3.Q←V[G]4.While Q≠∅5.Do u←EXTRACT-MIN(Q)6.S←S U{u}7.For 每个顶点v∈Adj[u]8.Do RELAX(u,v,w)Dijkstra算法如图3所示对边进行松弛操作,最左结点为源结点,每个结点内为其最短路径估计。
图3 Dijkstra算法的执行流程阴影覆盖的边说明了前驱的值:如果边(u,v)为阴影所覆盖,则π[v]=u。
黑色结点属于集合S,白色结点属于优先队列Q=V-S。
第1行对d和π值进行通常的初始化工作。
第2行置集合S为空集。