ダイクストラのアルゴリズムは、単一のソースがあり、あるノードから別のノードへの最小パスを知りたい場合にのみ使用されますが、失敗します[負のエッジを持つグラフで]
ダイクストラのアルゴリズムは、単一ソースの最短パスまたはSSSPアルゴリズムの一例です。すべてのSSSPアルゴリズムは、選択されたソースノードからグラフ内の他のすべてのノードまでの最短パス距離を計算します。さらに、sから他のすべてのノードへのすべての最短パスのコンパクトな表現を、根付きツリーの形式で計算します。ウィキペディアのコードでは、このツリーのvの親です。ssprevious[v]
v
エッジが負のグラフでのダイクストラのアルゴリズムの動作は、議論中の正確なバリアントに依存します。Wikipediaのアルゴリズムのようなアルゴリズムのいくつかのバリアントは、常に迅速に実行されますが、ネガティブエッジがある場合に最短経路を正しく計算しません。これらの講義ノートのような他の変形は、常に最短経路を正しく計算します(ソースから到達可能な負のサイクルがない限り)が、負のエッジがある場合、最悪の場合指数関数的な時間が必要になる場合があります。
Floyd-Warshallのアルゴリズムは、すべてのノードのいずれかがソースになる場合に使用されるため、任意のソースノードから任意の宛先ノードに到達する最短距離が必要です。これは、負のサイクルがある場合にのみ失敗します。
そのとおりです。Floyd-Warshallは、すべてのペアの最短パスアルゴリズムの 1つの例です。つまり、ノードのすべてのペア間の最短パスを計算します。別の例は、「各ノードvについて、vをソースノードとしてダイクストラを実行する」です。他にもいくつかあります。
ソースが1つしかない場合、Bellman-Fordはダイクストラのように使用されます。これは負の重みを処理でき、その動作は1つのソースを除き、Floyd-Warshallの動作と同じですよね?
Bellman-Fordは、ダイクストラのような単一ソースの最短パスアルゴリズムの別の例です。Bellman-FordとFloyd-Warshallは類似しています(たとえば、両方とも動的プログラミングアルゴリズムです)が、Floyd-Warshallは「各ノードvに対して、vをソースノードとしてBellman-Fordを実行」と同じアルゴリズムではありません。特に、Floyd-Warshallは時間で実行されますが、Repeater -Bellman-FordはO (V 2 E )時間(各ソース頂点のO (V E )時間)で実行されます。O(V3)O(V2E)O(VE)
詳細については、お気に入りのアルゴリズムの教科書を参照してください。(あなたが行う必要がありますが、好きなアルゴリズムの教科書ではないのですか?)