DAGの2つの頂点間の最短および最長パスを見つける


14

非加重DAG(有向非巡回グラフ)と2つの頂点および与えられた場合、多項式時間でからへの最短および最長の経路を見つけることは可能ですか?パスの長さは、エッジの数で測定されます。D=(V,A)stst

多項式時間で可能な経路長の範囲を見つけることに興味があります。

追って、この質問はStackOverflow質問DAGの最長パスの複製です。

回答:


10

最短経路の問題では、重みを気にしない場合、幅優先探索が確実な方法です。それ以外の場合、ダイクストラのアルゴリズムは、ネガティブエッジがない限り機能します。

最長パスでは、すべてのエッジの重みを無効にして、グラフ上で常にベルマンフォードを実行できます。ベルマンフォードは負のウェイトサイクルがない限り機能することを思い出してください。したがって、DAGのどのウェイトでも機能します。


2
Bellman-Ford は、動的プログラミングアルゴリズムです。
— ラファエル

1
@Raphael yes
— jmite

1
@jmite:もちろん、なぜ、:ちょうどオンライン変換を行う、または最大化するために変更ベルマン・フォード、または...
— ラファエル

1
ちなみに、NP完全問題Longest PathがDAGのPに簡単にあると直感的に確信していません。証拠/参照/説明をお願いします。
— ラファエル

2
また、DAG

8

ましょうおよびm = | E (G )| 。ましょうwは(→ B )エッジの重み示す(→ Bを)。sからtまでの最小および最大パスコストを検索するとします。n=|V(G)|m=|E(G)|w(a→b)(a→b)st

から開始して、次を実行します。b:=t

  1. がすでにアクセスされている場合、既に計算されたmin (b )およびmax (b )を返します。それ以外の場合は、bを訪問済みとしてマークします。bmin(b)max(b)b

  2. 次のように、およびmax (b )を決定して記録します。min(b)max(b)

    • 場合、min (s ):= max (s ):= 0を保存します。b=smin(s):=max(s):=0
    • それ以外の場合の最小設定(b ) min(a)=max(a)=inaccessibleの頂点を無視します。空のエッジセットで最小値と最大値を計算する場合(bへのインバウンドエッジがない、またはすべて無視される)、min(b)を設定します。
      分(b):=分a→b[w(a→b)+分(a)]最大(b):=最大a→b[w(a→b)+最大(a)]
      分(a)=最大(a)=私naccess私bleb。min(b):=max(b):=inaccessible

すべての頂点変数を初期化するのに必要な時間を無視して、このアルゴリズムが時間で実行されることを証明できるはずです。O(m)


この再帰的な「プル」アプローチは、実際の通常の動的な「プッシュ」アプローチよりも実際に遅くなる可能性があり、再帰を処理するには線形サイズのスタックが必要です。通常のアプローチは、トポロジカルな順序で頂点を取得し、現在のノードの各近傍の暫定的な最小値と最大値を改善することです。すべてのインバウンドエッジは、それらを改善するためにすでに使用されている必要があるため、現在のノードには常に最小値と最大値の最終値があります。
— パレック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.