ワーシャル・フロイド法: 全地点どうしの最短距離をまとめて出そう
ワーシャル・フロイド法は、「途中にこの地点を通ると短くなるか」を全組み合わせで調べる方法です。
1つのスタートだけではなく、すべての地点どうしの最短距離をまとめて知りたいときに使います。
使いどころ
- すべての町どうしの最短距離を知りたい
- 頂点数がそこまで多くないグラフ
- 経由地を使うと短くなるか調べたい
手順
- 最初に直接行ける距離を表にする
- 経由地
kを1つ決める i → jよりi → k → jが短いか調べる- すべての
kについてくり返す
図で見る
コピペ用コード
INF = 10**9
dist = [
[0, 3, 10],
[INF, 0, 4],
[INF, INF, 0],
]
for k in range(3):
for i in range(3):
for j in range(3):
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
print(dist)
コードの読み方
dist[i][j]は、iからjへの今分かっている最短距離です。kは、途中で通ってよい地点です。min(dist[i][j], dist[i][k] + dist[k][j])で、経由したほうが短いか調べています。
計算量
3重ループなので O(n^3) です。頂点が多すぎる場合は重くなります。