弗洛伊德 - 沃舍尔算法
给定一个大小为 n x n 的矩阵 dist[][],其中 dist[i][j] 表示从节点 i 到节点的边权重。如果没有直接边,则设为一个较大的值(例如 10^8)以表示无穷大。对角线元素 dist[i][i] 为 0,因为节点到自身的距离为零。该图可能包含负边权重,但不包含任何负权重环。
你的任务是确定图中所有节点对 i 和 j 之间的最短路径距离。
示例
输入:
dist[][] = [
[0, 4, 1e8, 5, 1e8],
[1e8, 0, 1, 1e8, 6],
[2, 1e8, 0, 3, 1e8],
[1e8, 1e8, 1, 0, 2],
[1, 1e8, 1e8, 4, 0]
]

输出:
[[0, 4, 5, 5, 7],
[3, 0, 1, 4, 6],
[2, 6, 0, 3, 5],
[3, 7, 1, 0, 2],
[1, 5, 5, 4, 0]]
解释:输出中的每个单元显示了节点 i 到节点 j 的最短距离,该距离是通过考虑所有可能的中间节点,使用 Floyd-Warshall 算法计算得出的。

算法原理
弗洛伊德 - 沃舍尔算法通过维护一个表示节点间距离的二维数组来工作。最初,该数组仅使用节点之间的直接边填充。然后,算法通过检查中间节点是否有更短路径,逐步更新这些距离。
该算法适用于有向和无向加权图,并且可以处理具有正权和负权边的图。
注意:对于存在负权环的图(环中边的和为负),该算法不适用。
核心思想
假设我们有一个图的 dist[][],顶点从 0 到 V-1 共有 V 个。现在我们需要评估一个 dist[i][j],代表顶点 i 到 j 的最短路径。
假设顶点 i 到 j 之间有中间节点 k。Floyd Warshall 算法背后的理念是将从 0 到 V-1 的每个顶点 k 逐一视为中间节点。当我们考虑顶点 k 时,必定已经考虑过 0 到 k-1 的顶点。因此,我们使用前顶点构建的最短路径,以构建包含顶点 k 的较短路径。
下图展示了上述弗洛伊德 - 沃舍尔算法中最优子结构性质:




