これは、任意のバイナリDAG でのLMCの多項式時間アルゴリズムです(試行)。G
これは質問#3に答えます。(事前に面倒な書き込みをして申し訳ありません。:))
まず、から到達できない頂点を「永久に」捨てます。これらはs - tパスの一部ではないため、これらについては気にしません。sst
次に、最初は空のサブDAG およびBを定義します。次いで、すべての頂点のためのV ∈ G - { S 、Tを}、ABv∈G−{s,t}
からtへのパスがあるかどうかをテストします。その場合、vをAに追加します。そうでない場合は、vをBに追加します。vtvAvB
縁ましょ及びBは、から任意のエッジを無視し、今の各セット内の頂点によって誘導されるもの(BE SにAを、からAにT、およびからAにB ;またからのエッジがない注意Bは、にTによって建設)。ABsAAtABBt
次に、の推移閉包を計算します。つまり、サブDAG Aの「葉」である頂点{ a ∗ }のセットを見つけることに興味があります。A{a∗}A
そのよう修正します。以下からの有向エッジが存在しなければならないことを確認して*にトン。構造によって、(i)が存在し、これは、S - Tを通る経路*、(II)からの経路が存在しない*を介してB、及びので(III)のAは、それ自体DAGであり、*は葉でありますAから経路がない*の別の頂点を介してAにtが。a∗a∗tsta∗a∗BAa∗Aa∗At
現在、各頂点からBのある頂点への有向エッジも存在する必要があります。または、{ a ∗ }の一部はtへの単一エッジを持っています。いずれの場合でも、a ∗ → tエッジを削除できます。{a∗}B{a∗}ta∗→t
もし= 1、我々はユニークからエッジを削除しなければならないのいずれかでA * → T、または頂点は、先に存在するS - Tを含むパス*に二つの経路有するTにわたり1 - *と直接一つ。後者が成立する可能性がある場合、∗ → tを記録し、「欲張りに逆行」します(詳細は以下を参照)。|{a∗}|a∗→tsta∗ta∗a∗→t
もし> 1の場合、{ a ∗ } → tからすべてのエッジを削除するか、いくつかのエッジk < | { a ∗ } | { a ∗ }を介してsからtへのすべてのパスを切断するAの推移的閉包の初期。|{a∗}|{a∗}→tk<|{a∗}|As{a∗}t
これは、グラフがバイナリDAGであるという事実を使用する場所です。G
前任者のセットを考えます。これらの頂点のそれぞれには最大2つの次数があるため、正確に3つのケースがあります。{a∗}
ケース1。前任者はある頂点へのアウトエッジとBのある頂点へのアウトエッジを持っています。{a∗}B
この場合には、我々が頂点に先行からエッジを削除するかは問題ではない又はにおける頂点からエッジ{ * }にT。したがって、この頂点を「スキップ」できます(そして、後方パスが{ a ∗ }の別の頂点のパスとマージするかどうかを確認します)。{a∗}{a∗}t{a∗}
ケース2 Aの前身で頂点に外端を有し、との別の前身{ * }。{a∗}{a∗}
この場合、からtへの両方のエッジを削除するか、sから両方のパスを切断する先行へのパス内の単一の以前のエッジを削除する必要があります。{a∗}ts
ケース3。前任者は 2つの頂点へのアウトエッジを持っています。{a∗}
これは、ケース2と同じであるこの問題ではない、我々は、この先行の縁部の一方からの対応する他のエッジを削除するかどうかにTからエッジ、または両方{ * }にTを。私達はちょうど私たちからのパスを切断することができるかどうか知りたいのにこの前任者を通じてトン、以前からのパスでは、単一のエッジとの前身に。{a∗}t{a∗}tsts
全体として、の推移閉包の前任者を逆方向にスキャンすると、「これまでで最高の」選択を貪欲に追跡できます。つまり、すべてのステップで、いくつかのエッジを削除するという明確な選択肢がありますが、より良いオプションが利用可能かどうかを確認したいのです。より良いオプションが見つかると、前のオプションを「忘れる」ことができます。したがって、前任者の各層での貪欲な選択で十分です(最後まで選択をコミットするまで待機する限り)。A
したがって、いくつかの基本的なメモ化では、このプロセスの時間と空間の複雑さはせいぜいように見えます。これにより、「安い選択」を見つけたときにローカル/貪欲に特定できる一方で、以前に記録されたエッジを削除することが先験的に不明であるという事実は除外されます。したがって、エッジをチェックする順序を記録します。より良いオプションを見つけたら、以前に記録したどのエッジを削除するかを見つけるために、この時点まで検索を繰り返します。このステップの合計時間の複雑さはO (| E | 2)およびスペースの複雑さO (| E |)です。O(|E|)O(|E|2)O(|E|)。
全体として、時間の複雑さは、初期化では、推移的閉包ではO (| V | 3)、検索ではO (| E | 2)です。合計時間はO (| V | 2 + | E | | V | + | V | 3O(|V|⋅(|V|+|E|))O(|V|3)O(|E|2)。O(|V|2+|E||V|+|V|3+|E|2)=O(|V|3+|E|2)
プロセスを完了すると、グラフ内のすべての頂点の少なくとも1つのアウトエッジを保持しながら、tからを切断するために必要なエッジの最小セットを取得します(または、途中で解が不可能であることがわかり、中止します)。st