Floyd算法,又称为Floyd-Warshall算法,是一种经典的动态规划算法,用于求解加权图中所有顶点对之间的最短路径问题。该算法由Robert Floyd和Stephen Warshall在1962年分别独立提出。以下是对Floyd算法的详细剖析:
一、算法原理
Floyd算法的基本思想是通过逐步尝试所有顶点作为中间点,来更新任意两点之间的最短路径。算法假设Dis(i,j)
为节点i
到节点j
的最短路径的距离,对于图中的每一个节点k
,算法检查是否通过节点k
可以使i
到j
的路径更短,即检查Dis(i,k) + Dis(k,j) < Dis(i,j)
是否成立。如果成立,则更新Dis(i,j)
为Dis(i,k) + Dis(k,j)
。
二、算法步骤
Floyd算法的实现步骤可以归纳如下:
- 初始化:
- 创建一个二维数组
dist
,用于存储任意两点之间的最短路径长度。初始时,dist[i][j]
被设置为节点i
到节点j
的直接距离(如果节点i
和节点j
之间有直接连接),否则被设置为无穷大(表示两点之间无直接路径)。 - 创建一个二维数组
path
(可选),用于记录最短路径上的中间节点,以便后续恢复最短路径。
- 创建一个二维数组
- 逐步更新:
- 对于图中的每一个节点
k
(作为中间点):- 遍历所有节点对
(i, j)
:-
<
- 遍历所有节点对
- 对于图中的每一个节点