性质1:
一条最短路径的所有子路径也是最短路径。
从顶点 i 到顶点 j 的最短路径:
假设 i 到 j 的最短路径需要经过若干个顶点中转,k 是索引值最大的中转顶点,根据性质 1,可以得到:
对于任意 k(1 <= k <= n):
当 k = 0 时,意味着无需中转,D[k][i][j] = Weight[i][j]
。
否则,存在两种情况:
D[k][i][j] = D[k-1][i][k] + D[k-1][k][j]
D[k][i][j] = D[k-1][i][j]
因此 D[k][i][j] = MIN(D[k-1][i][j], D[k-1][i][k] + D[k-1][k][j])
。
Floyd 算法本质上是一个动态规划。
可以设置两个辅助数组 D[][] 和 P[][],其中 D[i][j] 用来保存从 i 到 j 的最短路径,初始时,任意两个顶点之间的最短路径是 INFINITY;P[i][j] 用来保存从 i 到 j 所需经过的中继顶点,初始时,P[i][j] = j。对于已经计算出最短路径的两个顶点,可以直接从 D[][] 取值,以防止重复计算,提高执行效率。P[][] 主要用来追踪最短路径。