最短路径算法——清晰简单的弗洛伊德算法(Floyd)
Posted 土豆同学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径算法——清晰简单的弗洛伊德算法(Floyd)相关的知识,希望对你有一定的参考价值。
弗洛伊德算法(Floyd)
\\qquad 上一篇文章介绍了迪杰斯特拉算法(Dijkstra)。具体请看:最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图,并且一次只能从网络中找源点到任何一个节点的最短路径,而Floyd算法的应用更加广泛,可以求网络中任意两点之间的最短路径,而且弗洛伊德算法适用于负权图,这篇文章就用图和表的形式来介绍一下弗洛伊德算法!
1 思想(原理)
\\qquad Floyd算法可以给出网络中任意两个节点之间的最短路径,因此它是比Dijkstra更一般的算法。Floyd算法的思想是将 n n n个节点的网络表示为 n n n行 n n n列的矩阵,而矩阵中的元素 ( i , j ) (i,j) (i,j)表示从节点 i i i到节点 j j j的距离 d i j d_{ij} dij,如果两点直接没有边相连,则相应的元素就是无穷 ( ∞ ) (\\infty) (∞).
2 步骤
<1> 第0步:定义初始距离矩阵
D
0
D_0
D0、节点序列矩阵
S
0
S_0
S0,如下表。对角线上用”—“表示不需要从自身到自身。
\\qquad 这里的节点序列矩阵相当于路线表,如下表, S i j = j S_{ij}={j} Sij=j表示,从节点 i i i到节点 j j j只需经过节点 j j j即可。
令 k = 1 k=1 k=1.
<2> 一般的第k步:令第 k k k行为枢轴行,第 k k k列为枢轴列。对于矩阵 D k − 1 D_{k-1} Dk−1(上一步完成后的矩阵)中对的每一个元素做三重操作。
如果满足条件:
d
i
k
+
d
k
j
<
d
i
j
(
i
≠
k
,
j
≠
k
,
i
≠
j
)
d_{ik}+d_{kj}<d_{ij} \\qquad (i≠k,j≠k,i≠j)
dik+dkj<dij(i=k,j=k,i=j)
则进行下面的操作:
<\\a> 用
d
i
k
+
d
k
j
d_{ik}+d_{kj}
dik+dkj代替矩阵
D
k
−
1
D_{k-1}
Dk−1中的元素
d
i
j
d_{ij}
dij,从而得到矩阵
D
k
D_k
Dk.
<\\b> 用
k
k
k代替矩阵
S
k
−
1
S_{k-1}
Sk−1中的元素
s
i
j
s_{ij}
sij,从而得到矩阵
S
k
S_k
Sk.
<\\c> 令
k
=
k
+
1
k=k+1
k=k+1,如果
k
=
n
+
1
k=n+1
k=n+1,停止,否则重复<2>.
3 栗子
\\qquad
直接看方法步骤会感觉太抽象,这里用一个例子进行步骤的演示.
\\qquad
对下图中的网络,求任意两个节点之间的最短路径,图中弧上给出了相应节点间的距离。弧(3,5)是有向的,其他边都是双边。
迭代0:矩阵
D
0
D_0
D0和
S
0
S_0
S0代表初始的网络。可以看到矩阵
D
0
D_0
D0除了
d
53
=
∞
d_{53}=∞
d53=∞外(因为弧(3,5)是单向弧),
D
0
D_0
D0是对称的。
迭代1:令 k = 1 k=1 k=1. D 0 D_0 D0矩阵中的黄色阴影表示的第1行和第1列为枢轴行和枢轴列。根据三重操作发现可以改进的元素是 d 23 d_{23} d23和 d 32 d_{32} d32,即
(1)
d
21
+
d
13
=
3
+
10
<
∞
d_{21}+d_{13}=3+10<∞
d21+d13=3+10<∞,则在
d
23
d_{23}
d23中用
13
13
13代替
∞
∞
∞,并令
s
23
=
1
s_{23}=1
s23=1.
(2)
d
31
+
d
12
=
10
+
3
<
∞
d_{31}+d_{12}=10+3<∞
d31+d12=10+3<∞,则在
d
32
d_{32}
d32中用
13
13
13代替
∞
∞
∞,并令
s
32
=
1
s_{32}=1
s32=1.
此时得到 D 1 D_1 D1和 S 1 S_1 S1,得到下表
迭代2:令
k
=
2
k=2
k=2.
D
0
D_0
D0矩阵中的黄色阴影表示的第2行和第2列为枢轴行和枢轴列。根据三重操作发现可以改进的元素是
d
14
d_{14}
d14和
d
41
d_{41}
d41,即
以上是关于最短路径算法——清晰简单的弗洛伊德算法(Floyd)的主要内容,如果未能解决你的问题,请参考以下文章 【数据结构】最短路径之迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
(1)
d
21
+
d
42
=
3
+
5
=
8
<
∞
d_{21}+d_{42}=3+5=8<∞
d21+