重み付きグラフにおけるすべての頂点間の最短経路を計算する
- 入力:グラフ
- 出力:間の最短経路
- 計算量:
概要
として、すべてのに対して、
- からへの経路を通るコストと
- からを経由してへ向かう経路を通るコスト
の小さい方をからへの経路のコストとして選択する。 これをすべてのについて行うと、すべてのに対する最短経路を得られる。
解釈
のとき、はの道中に頂点のみを含むときの最短経路を表す。
コード
// V = {0, 1, ..., N - 1}のときのワーシャルフロイド法
Array2D<uint64_t> warshall_floyd(const Graph& graph) {
const size_t N = graph.vertex_count(); // 頂点数
Array2D<uint64_t> distances(N, N); // NxNの2次元配列
// 初期化
for (size_t i = 0; i < N; ++i) {
for (size_t j = 0; j < N; ++j) {
if (i == j) {
// 自分自身への距離は0になる
distances[i][j] = 0;
} else if (graph.has_edge(i, j)) {
// グラフがiからjへの辺を持っていれば、その辺の重みを使う
distances[i][j] = graph.edge(i, j);
} else {
// それ以外ならば、到達できないことを表す大きな値を使う
distances[i][j] = UINT64_MAX;
}
}
}
// 最短経路を計算する
for (size_t k = 0; k < N; ++k) {
for (size_t i = 0; i < N; ++i) {
for (size_t j = 0; j < N; ++j) {
distances[i][j] = std::min(distances[i][j], distances[i][k] + distances[k][j]);
}
}
}
return distances;
}