Floyd 算法介绍

x33g5p2x  于2022-07-10 转载在 其他  
字(0.9k)|赞(0)|评价(0)|浏览(322)

一 背景介绍

如果求解任意两个节点之间的最短路径,则需要以每个节点为源点,重复调用 n 次 DijKstra 算法。其实是完全没有必要这么麻烦,Floyd 算法可用于求解任意两个节点之间的最短距离。Floyd 算法又被称为插点法,其核心思想是在节点 i 与 j 之间插入节点 k,看看是否可以缩短节点 i 和 j 之间的距离。

二 算法步骤

1 数据结构

设置地图带权邻接矩阵为 G.Ege[][],即如果从节点 i 到节点 j 有边,则 G.Ege[i][j]=<i,j>的权值,否则 G.Ege[i][j]=无穷大;采用两个辅助数组:最短距离数组dist[i][j],记录从节点 i 到节点 j 的最短路径长度;前驱数组 p[i][j],记录从节点 i 到节点 j 的最短路径商节点 j 的前驱。

2 初始化

初始化 dist[i][j]=G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化 p[i][j]=i,否则 p[i][j]=-1。

3 插点

在节点 i 和 j 之间插入节点 k,看是否可以缩短节点 i、j 之间的距离。如果 dist[i][j] > dist[i][k] + dist[k][j],则 dist[i][j] = dist[i][k] + dist[k][j],记录节点 j 的前驱 p[i][j]=p[k][j]。

三 图解

最初的地图如下:

1 数据结构

最初 G.Ege[i][j] 的权值如下

2 初始化

初始化最短距离数组为 G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化前驱数组 p[i][j]=i,否则 p[i][j]=-1。初始化 dist[][] 和 p[][],如下图所示。

3 针对 k=0 进行插点

插入后的路径可能有 2 条。
2 0 1

2 0 3

插入后 dist[][] 和 p[][],如下图所示。

4 针对 k=1 进行插点

插入后的路径可能有有 4 条。
0 1 2

0 1 3

2 1 0

2 1 3

插入后 dist[][] 和 p[][],如下图所示。

5 针对 k=2 进行插点

插入后的路径可能有 6 条。
1 2 0

1 2 3

3 2 0

3 2 1

插入后 dist[][] 和 p[][],如下图所示。

6 针对 k=3 进行插点

0 3 1

0 3 2

1 3 0

1 3 2

2 3 0

2 3 1

插入后 dist[][] 和 p[][],如下图所示。

7 插点结束

dist[][] 包含了各个节点之间的最短距离。可从 p[][] 推测出各个节点的最短路径。 

相关文章