Floyd 是一种优秀的全源最短路算法。
它的执行过程类似于 dp,如下:
首先我们定义
d
[
i
]
[
j
]
d[i][j]
d[i][j] 为节点
i
i
i 到节点
j
j
j 的最短距离。
我们枚举中转节点
k
k
k,再枚举两个节点
i
,
j
i,j
i,j,显然得到转移方程
d
[
i
]
[
j
]
=
min
(
d
[
i
]
[
j
]
,
d
[
i
]
[
k
]
+
d
[
k
]
[
j
]
)
d[i][j]=\min(d[i][j],d[i][k]+d[k][j])
d[i][j]=min(d[i][j],d[i][k]+d[k][j])。
结束遍历后,
d
[
i
]
[
j
]
d[i][j]
d[i][j] 即为答案。
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
注:在稀疏图中,Floyd 不如跑 n n n 遍 Dijkstra。但是 Floyd 其实是一种 ( min , + ) (\min,+) (min,+) 的广义矩阵乘法,所以有时可以用于解决进阶问题。