一 背景介绍
如果求解任意两个节点之间的最短路径,则需要以每个节点为源点,重复调用 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] 的