Floyd 求多源最短路径原理
1. 经典三层循环如下
for(int k = 1 ; k <= n ; k ++)
{
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
{
if(e[i][j] > e[i][k] + e[k][j])
e[i][j] = e[i][k] + e[k][j];
}
}
}
2. 为什么能保证答案就是最短路径
首先i 到 j 的最短路径有两种情况:直接和间接。
要么 e[i][j] 身就是两者最短路径,要么通过其他点中转。
Floyd 三层循环本质就是枚举 1-n 所有点作为中间站来松弛。
对于求 i 和 j 的最短路径,松弛了1,2,3 顶点才得到,可以看到只要松弛了这三个顶点,就能得出最小路径,而与松弛的顺序没有关系。
所以要求任意 i 到 j 之间的最短路径,只需松弛所有结点即可。