ワーシャルフロイド法
ワーシャルフロイド法とは グラフのすべての頂点の組 (u,v) に対して、u から v への最短距離を求めるアルゴリズム。 辺のコストが負でもよい。 ワーシャルフロイド法のアルゴリズム 頂点 u から頂点 v への距離 d[u][v] を u から v への辺 (u,v) のコストで初期化、辺がなければ無限大としておく。また、頂点 u から頂点 u 自身への距離 d[u][u] は 0 としておく。 以下の操作を k=0, 1, …, n-1 (頂点数: n) の順に行う。 グラフのすべての頂点の組 (u,v) に対して、通れる頂点を頂点集合 {0, 1, …, k} ∨ {u, v} の頂点のみに限定したときの最短距離を求め、その距離が d[u][v] より小さければ d[u][v] をその距離で更新。 距離 d[u][u] < 0 となる頂点 u が存在すれば、負閉路が存在する、存在しなければ負閉路も存在しない。 説明 アルゴリズムの 2. の操作 (図) 例えば、こんなグラフがあったとする。 例えば、k=2, u=4, v=6 なら、以下の範囲で頂点 u から頂点 v への最短距離を調べる。(頂点集合 {0, 1, 2} ∨ {4, 6}) これを、(k, u, v)=(0, 0, 0), (0, 0, 1), …, (0, n-1, n-1), (1, 0, 0), …, (1, n-1, n-1), …, (n-1, 0, 0), …, (n-1, n-1, n-1) の順に調べていく。(一応、k が k=0, 1, …, n-1 の順なだけで (k, 0, 0), (k, 0, 1), …, (k, n-1, n-1) は順不同。) 通れる頂点を限定したときの最短距離ってどう求めるの? [通れる頂点を頂点集合 {0, 1, …, k} ∨ {u, v} の頂点のみに限定したときの最短距離 (以下、d k [u][v])] は、すべての頂点の組 (u, v) で、[通れる頂点を頂点集合 {0, 1, …, k-1} ∨ {u, v} の頂点のみに限定したときの最短距離 (以下、d k-1 [u][v])] を求められていれば簡単に求められる。 まず、[通れる頂点を頂点集合 {0, 1, …, k} ∨ {u, v} の頂点のみに...