ベルマンフォード法

辺の重みを編集し、各ラウンドで全辺を緩和して最短経路を求めます。負の辺があっても正しく動き、負閉路も検出します d[v] = min(d[v], d[u] + w)

辺の重み(負の値も設定できます。マイナスにすると赤く表示)
重み w
始点
A
ラウンド数 i
0 / |V|−1 = 4
このラウンドの更新数
状態
準備完了
距離 d[v](始点 A からの暫定最短)
有向グラフ(緑=最短経路木の辺 / 赤=負の辺)
ベルマンフォード法は、始点から各頂点への最短経路を求めるアルゴリズムです。やることはシンプルで、すべての辺について「緩和(リラクゼーション)」を |V|−1 回くり返すだけ。
緩和とは、辺 u → v(重み w)について d[u] + w < d[v] なら d[v] を d[u] + w に更新する操作です。これを全辺・全ラウンドで行うと最短距離に収束します。
Dijkstra 法より遅いものの、負の重みの辺を扱える点が強みです。さらに |V|−1 回の後にもう 1 回まわしてまだ更新が起きるなら、たどると無限に距離が下がる「負閉路」が存在すると判定できます。

いま何が起きている?

ここがポイント