最短路径
第一类问题:两点间的最短路径 ----Dijkstra算法
第一类问题:某源点到其他各点最短路径 ----Floyd算法
Dijkstra算法
-
单源点最短路径
1.初始化:先从源点找到到各个终点的路径
2.选择:从路径中选出一条长度最短的路径
3.更新:然后对其余路径进行适当调整
如下例所示
假设有下面这样的图: A / \ 6 1 / \ C---2---B---3---D \ \ 4 1 \ \ E---1---F
1.首先将所有节点的最短路径距离设置为无穷大,除了起点A,我们将它的最短路径距离设置为0。 最短路径距离: A: 0 B: ∞ C: ∞ D: ∞ E: ∞ F: ∞ 2.从A开始,我们考虑它的邻居B和C。通过A到达它们的距离分别是1和6。我们更新B和C节点的最短路径距离。 最短路径距离: A: 0 B: 1 (由A更新) C: 6 (由A更新) D: ∞ E: ∞ F: ∞ 3.下一步,选择最短路径距离最小的节点,这里是B,权重为1,然后考虑B的邻居节点D、F、C。通过B到达D的距离是4 (1+3),到F是2 (1+1)。更新D和F的最短路径距离。 最短路径距离: A: 0 B: 1 C: 3 (由B更新) D: 4 (由B更新) E: ∞ F: 2 (由B更新) 4.下一步中,我们选择新的最短路径距离最小的节点,即F,权重为2。F的邻居有E和B,但通过F到B不会比已有的路径更短,我们检查到E的距离,是3。更新E的最短路径距离 最短路径距离: A: 0 B: 1 C: 3 (由B更新) D: 4 (由B更新) E: 3 (由F更新) F: 2 5.接下来,我们选择E,跟新C为7(3+4),但这没有比现在的3小所以保留。 最短路径距离: A: 0 B: 1 C: 6 D: 4 E: 3 F: 2
Folyd算法
-
所有顶点间的最短路径
1.逐个顶点试探
2.列出两顶点存在的所有可以
3.选出最短的初始距离矩阵
如下例所示
A <----1----> B ----2----> C \ ^ \ / --------4------------
A B C A 0 ∞ ∞ B ∞ 0 ∞ C ∞ ∞ 0 加入边缘的权重,AB距离是1,B到C的距离是2,A到C的距离是4 A B C A 0 1 4 AB AC B 1 0 2 BA BC C ∞ ∞ 0 选择节点B作为中间节点。我们检查所有通过B的路径,看看能否改进 A B C A 0 1 3 AB ABC B 1 0 2 BA BC C ∞ ∞ 0 选择节点A作为中间节点。我们检查所有通过B的路径,看看能否改进 不能 选择节点C作为中间节点。我们检查所有通过B的路径,看看能否改进 不能