Menu
CoddyTech

Floyd Warshall Algorithm

给定一个有向图,它有 n 个节点,编号从 0 到 n-1,并用一个 n 行 n 列的矩阵表示:matrix[i][j] 表示从节点 i 到节点 j 的边的权重;如果没有边,则为 -1;并且 matrix[i][i] 为 0。路径的长度是其所有边权重之和。

返回一个 n 行 n 列的矩阵,其中 [i][j] 表示从节点 i 到节点 j 的最短路径长度;如果从节点 i 无法到达节点 j,则为 -1。

函数

shortestDistances(matrix: integer-2d-array) → integer-2d-array
matrixinteger-2d-array
边的权重:matrix[i][j] 表示从 i 到 j 的边的权重,如果不存在该边,则为 -1
返回值integer-2d-array
每对节点之间的最短距离,没有路径时为 -1

约束条件

  • 1 ≤ n ≤ 100,其中 n = matrix.length = matrix[i].length
  • matrix[i][i] = 0
  • 当 i ≠ j 时,matrix[i][j] 是 -1(没有边),或者满足 0 ≤ matrix[i][j] ≤ 1000。
  • 边是单向的:matrix[i][j] 和 matrix[j][i] 互不影响。

示例

输入
matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]
输出
[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]
解释
通过节点 1,节点 0 到达节点 2 的距离为 6,而不是 11;到达节点 3 的距离为 9。节点 1 通过节点 2 到达节点 0 的距离为 3。没有边从节点 3 出发,因此其行在对角线之外的值为 -1。
challenge icon

进阶

构建表格后,有一条边的成本降低了。你能否在 O(n²) 时间内更新所有距离,而不是再次运行 O(n³) 次循环?

重置代码
def shortestDistances(matrix):
    # 在这里编写代码

测试 #1

测试 #2

参数

matrix = [[0, 4, 11, -1], [-1, 0, 2, 9], [1, -1, 0, 3], [-1, -1, -1, 0]]

预期输出

[[0, 4, 6, 9], [3, 0, 2, 5], [1, 5, 0, 3], [-1, -1, -1, 0]]