Menu
CoddyTech

Floyd Warshall Algorithm

ノード数が n の有向グラフが与えられます。ノードには 0 から n-1 まで番号が付けられており、グラフは n 行 n 列の行列で表されます。matrix[i][j] はノード i からノード j への辺の重みを表し、辺がない場合は -1 です。また、matrix[i][i] は 0 です。経路の長さは、経路上の辺の重みの合計です。

ノード i からノード j までの最短経路の長さを [i][j] の要素とする n 行 n 列の行列を返してください。ノード 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に11ではなく6で到達し、ノード3には9で到達します。ノード1はノード2を経由してノード0に3で到達します。ノード3からは何も出ていかないため、対角成分以外の行の値は-1です。
challenge icon

発展問題

テーブルを作成した後、1つの辺のコストが下がります。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]]