Dijkstra算法
技巧:把已经发现的从起点a能够抵达点P的距离作为最短距离(未知)的上限d保存起来,记录为P(d), 后期发现能够更小的话,就更新这个点的参数值d,直到不能再更新为止。
二. 最短路问题
问题:给定简单权图G = (V, E),并设G 有n个顶点,求G中点u0
到其它各点的距离。
(1) 置 l(u0) = 0;对所有v∈V {u0},令 l(v) = ∞; S0 = {u0},i = 0。
(2) 若i = n-1,则停
;否则令 Si= V \Si 对每个v∈Si,令 l(v) = min {l(v),l(ui) + w(uiv)}
(4)并用 ui+1记达到最小值的某点。置Si+1= Si∪{ui+1},
i = i+1(表示赋值语句,以后的算法中相同),转(2)。
基本思想
通过Dijkstra计算图G中的最短路径时,需要指定起点u0(即从顶点u0开始计算)。
此外,引进两个集合S和S^-。S的作用是`记录已求出最短路径的顶点`(以及相
应的最短路径长度),而S^-则是记录`还未求出最短路径的顶点`(以及该顶点
到起点u0的距离)。
初始时,S中只有起点u0;S^-中是除u0之外的顶点,并且S^-中顶点的路径是
”起点u0到该顶点的路径”。然后,`从S^-中找出路径最短的顶点,并将其嫁
入S中(即PPT中第(4)步的Si+1及ui+1的赋值);`接着,更新S^-中的顶点
和顶点对应的路径。 然后,再从S^-中找出路径最短的顶点,并将其嫁入S中
;接着,更新S^-中的顶点和顶点对应的路径。 … 重复该操作,直到遍历完
所有顶点。
注:`纳入S集合后,路的距离就从“估计值”变为了“确定值”,后面都是更新
S^-的元素`
解题操作实例:
图 2 中 S 到 T 的最短路的长度为_______ .
解:
1.
2.
动图:
动图:
注:
这次选取的点的值,虽是最小,却不是被更新的点
。一定是由过去选择的另一条路径的接续得到的。
B点的上次更新是由S更新,所以,S点是B的前驱点
。
4.
动图:
注:
这次选取的点的值,虽是最小,却不是被更新的点
。一定是由过去选择的另一条路径的接续得到的。
D点的上次更新是由A更新,所以,A点是D的前驱点
。
5.
动图:
6.
动图:
注:
这次选取的点的值,虽是最小,却不是被更新的点
。一定是由过去选择的另一条路径的接续得到的。
C点的上次更新是由B更新,所以,B点是C的前驱点
。
7.
注:
这次选取的点的值,虽是最小,却不是被更新的点
。一定是由过去选择的另一条路径的接续得到的。
F点的上次更新是由B更新,所以,B点是F的前驱点
。
8.
所有走过的动作汇总
:{SA,SB,AD,DE,BC,BF,FT}总的过程:(S–>B–>F–>T是
S到T
的最短路径,注:可以由T为终点,回溯这条路径的形成。)