フロイド・ウォーシャルアルゴリズム

ワーシャル-フロイド法は、  解決のためにあるすべてのペア最短経路問題を問題は、所与のエッジ加重有向グラフにおける頂点のすべての対の間の最短距離を見つけることです。

V |一つのアプローチは、弊社の一般的な最短経路アルゴリズム(負のエッジが存在する可能性があるため)ベルマン・フォード・アルゴリズムを実行することです| 回、各開始ノードについて。(| V | ^ 2 * | E |)総走行時間は、Oだろう。私たちは、今より良い代替手段、Oが表示されます(| V | ^ 3)動的計画法に基づくワーシャル - フロイド法。

{1、2と仮定する数Vの頂点、。、N}、およびlet DIST(i、j、k)は iからjまでの最短経路の長さを表している唯一のノード{1、2、。、K}が中間体として使用することができますそれが存在する場合、最初に、DIST(I、jは、0)、iとjとの間の直接的なエッジの長さであり、そうでない場合は∞です。

我々は、余分なノードkを含むように、中間セットを展開するとどうなりますか?我々は、すべてのペアI、Jの見直しや中間点としてKを使用して私たちにiからjまで短いパスを与えるかどうかを確認する必要があります。しかし、これは簡単です:おそらく他の低い番号の中間ノードと一緒にKを使用して、私からjまでの最短経路(?なぜ我々は何の負のサイクルが存在しないことを前提としているため)一度だけのkを通過します。そして、我々はすでにだけ低い番号の頂点を使用してkおよびkからjへのために私からの最短経路の長さを計算しています:

このように、Kを使用すると、iからjまでの私たちに短いパスを与え、場合にだけ

DIST(I、K、K- 1)+ DIST(K、J、K- 1)<DIST(I、J、K- 1

その場合には、DIST(i、j、k)はそれに応じて更新されるべきです。

(| V | ^ 3)時間ここワーシャル - フロイド法-、あなたが見ることができるようです、それはOをとります。 

上記ルールの正直な実装では、3次元配列、DIST [I、J、K]を含むであろう。しかし、アルゴリズムの慎重な分析は、第三の次元を明示的に保存する必要がないことを明らかにしました。私たちは、(k番目の次元を省略)アルゴリズムの簡単なバージョンを紹介します。

証明:通知のDISTは[I、J、K] DIST [I、K、K-1]、DIST [K、J、K-1]とDIST [I、J、K-1]に依存します。ノードkが追加されたときDIST [K、J]とDIST [I、k]は小さい距離を達成することができないので、マトリックスDISTのk番目の列及びk行目は、この反復で同じままです。したがって、我々はDPで三次元を省略することができます。

#define V 4  
 の#define INF 99999   

ベクトル <ベクトル< INT >> floydWarshall(INT グラフ[] [V]){ 
    ベクトル <ベクトル< INT >> DIST(V、ベクトル< INT > (V))。
    以下のためにint型私= 0 ++; iがV < i)の
         ためのINT J = 0 ; J <V; ++ j)は
            DIST [I] [J] = グラフ[I] [J]。
    // 最短距離は、セット内の唯一の頂点{0、1、2、...、K-1}を中間頂点と考えます。
    以下のためのint型K = 0 ; V <K; ++ K){
         ためint型 I = 0 ; iがVを<; ++ i)が{
             ためINT J = 0 ; J <V; ++ ){J
                 場合(DIST [I ] [K] + DIST [K] [J] < DIST [I] [J])
                    DIST [I] [J] = DIST [I] [K] + DIST [K] [J]。
            } 
        } 
    } 
    戻りDIST。
} 

int型のmain(){  
     / * 私たちは、次の重み付きグラフを作成してみましょう   
         10   
    (0)------->(3)   
     | / | \  
   5 | |  
     | | 1   
    \ | / |  
    (1)------->(2)   
          3          * / 
    INTグラフ[V] [V] = {{ 05、INF、10 }、   
                        {INF、03 、INF}、   
                        {INF、 INF、01 }、   
                        {INF、INF、INF、0 }}。  
    オートDIST = floydWarshall(グラフ)。
    以下のためにint型 i = 0 ; iはVを<; ++ I){
         INT J =0 ; J <V; ++ j)は
            COUT << DIST [I] [J] << '  ' 
        coutの << てendl; 
    } 
    戻り 0 
}  

Oの時間複雑度(V ^ 3) 

 

参照

https://www.geeksforgeeks.org/floyd-warshall-algorithm-dp-16/

http://www.cs.umd.edu/class/fall2017/cmsc451-0101/Lects/lect13-dp-floyd.pdf

おすすめ

転載: www.cnblogs.com/hankunyan/p/11525341.html