現在地から目的地までの最短経路の選択に迷っていますか。
- Floyd-Warshall のアルゴリズムは、グラフ内のすべてのペアの頂点間の最短経路を見つけるために使用され、グラフ内の各辺には正または負の重みがあります。
- このアルゴリズムを使用する最大の利点は、任意の2つの頂点間のすべての最短距離をO(V3)(Vはグラフの頂点数)で計算できることである。
- フロイド-ウォーシャル・アルゴリズムは、フロイドのアルゴリズム、ロイ-フロイドのアルゴリズム、ロイ-ウォーシャルのアルゴリズム、WFIアルゴリズムとも呼ばれている。
アルゴリズム
N個の頂点を持つグラフについて:
Step 1: 任意の2頂点間の最短経路を無限大で初期化する。
Step 2: 中間頂点が0のペア最短経路をすべて探し、次に中間頂点が1ある最短経路を探し、そして… N個の頂点すべてを中間ノードとして使用するまで続ける。
ステップ3: 前の操作で得られた任意の2つのペア間の最短経路を最小化する。
ステップ4: 任意の2頂点 (i,j) に対して、実際には最初のK個のノードを使ってこのペア間の距離を最小化する必要があり、最短経路は次のようになる: min(dist+dist,dist).
distは最初のK個の頂点だけを使った最短経路、distはペアk、j間の最短経路を表わします。 最短経路はiからkへの最短経路、そしてkからjへの最短経路を連結したものになるため。
for(int k = 1; k <= n; k++){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
dist = min( dist, dist + dist );
}
}
}
例題
与えられたグラフを次のようにする:
![](https://miro.medium.com/max/60/0*_xHqSgP179ftnEPB.png?q=20)
以下の手順に従ってすべての頂点の組の間の最短経路を求めることができる.
- 次元
n*n
の行列A0
を作成し、nは頂点の数である。 行と列のインデックスはそれぞれiとjである。iとjはグラフの頂点である。
各セルAはith
頂点からjth
頂点までの距離で埋め尽くされている。 ith
頂点からjth
頂点への経路がない場合は、セルは無限大のままです。
![](https://miro.medium.com/max/60/0*zHEY97R1MtB27HdE.png?q=20)
2. 今度は行列A0
を使って行列A1
を作ってみましょう。 1列目、1行目の要素はそのままにしておきます。 残りのセルは次のようにして埋める。
送信元から送信先までの最短経路の凍結頂点をkとする。 このステップでは、kは第1頂点である。A
は(A + A) if (A > A + A)
で埋められる。
つまり、送信元から送信先までの直接距離が頂点kを通る経路より大きい場合、そのセルはA + A
で埋められる。
このステップでは、kは第1頂点である。 この頂点kを通る送信元の頂点から送信先の頂点までの距離を計算する。
![](https://miro.medium.com/max/60/0*7vlvb6dwy2m_uFJZ.png?q=20)
例えば、以下のようになる。 A1
の場合、頂点2から4への直接距離は4、頂点2から4への頂点を通る距離(つまり頂点2から1、頂点1から4)の和は7。 4 < 7
なので、A0
は4.
3で埋められます。 同じようにA3
を使って、A2
が作成されます。 列目、2行目の要素はそのままにします。
このステップで、kは2番目の頂点(つまり頂点2)です。 残りのステップはステップ2と同じです。
![](https://miro.medium.com/max/60/0*pnBDaBhEWy5JsZLr.png?q=20)
4. 同様にA3
とA4
も作成されます。
![](https://miro.medium.com/max/60/0*FDEA0qgqrEcYazxl.png?q=20)
![](https://miro.medium.com/max/60/0*k9Z0IpZfY9ORKYiV.png?q=20)
A4
は各頂点の組の間の最短経路が与えられる。
最短経路を選択するのに迷ったら、以下のコードで探してみてください。 しかし、正しい距離を入力する。
Time Complexity
3つのループがある。 各ループは一定の複雑さを持つ。 したがって、Floyd-Warshallアルゴリズムの時間複雑度はO(n3)となる。
Space Complexity
Floyd-Warshallアルゴリズムの空間複雑度はO(n2)となる。