如果求解任意两个节点之间的最短路径,则需要以每个节点为源点,重复调用 n 次 DijKstra 算法。其实是完全没有必要这么麻烦,Floyd 算法可用于求解任意两个节点之间的最短距离。Floyd 算法又被称为插点法,其核心思想是在节点 i 与 j 之间插入节点 k,看看是否可以缩短节点 i 和 j 之间的距离。
设置地图带权邻接矩阵为 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 的前驱。
初始化 dist[i][j]=G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化 p[i][j]=i,否则 p[i][j]=-1。
在节点 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]。
最初的地图如下:
最初 G.Ege[i][j] 的权值如下
初始化最短距离数组为 G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化前驱数组 p[i][j]=i,否则 p[i][j]=-1。初始化 dist[][] 和 p[][],如下图所示。
插入后的路径可能有 2 条。
2 0 1
2 0 3
插入后 dist[][] 和 p[][],如下图所示。
插入后的路径可能有有 4 条。
0 1 2
0 1 3
2 1 0
2 1 3
插入后 dist[][] 和 p[][],如下图所示。
插入后的路径可能有 6 条。
1 2 0
1 2 3
3 2 0
3 2 1
插入后 dist[][] 和 p[][],如下图所示。
0 3 1
0 3 2
1 3 0
1 3 2
2 3 0
2 3 1
插入后 dist[][] 和 p[][],如下图所示。
dist[][] 包含了各个节点之间的最短距离。可从 p[][] 推测出各个节点的最短路径。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/125685925
内容来源于网络,如有侵权,请联系作者删除!