DAGの推移的な削減


13

DAGが与えられた場合に推移的削減を見つけるためのO(V + E)アルゴリズムを探しています。

これは、可能な限り多くのエッジを削除するため、uからvに到達できる場合、任意のvおよびuに対して、エッジの削除後も到達できます。

これが標準的な問題である場合は、モデルの解決策を示してください。


あなたが引用したウィキペディアの補題で与えられた参照を使用することはできませんか?
ヘンドリック

2
さて、ウィキペディアで説明されているアルゴリズムは、要求されたO(V + E)の代わりにO(V×E)(最良の場合、つまり非循環グラフの場合O(V+Eされます。ここでの正しい答えは、現在探しているアルゴリズムが存在しない可能性があることだと思う
カルロスリナレスロペス

1
あなたが求めているものが存在することは明らかではないことに同意しました。そのようなアルゴリズムがあった場合、面白くないだろうかなりの数の論文があります。例えば、sciencedirect.com/science/article/pii/0012365X9390164O。そうは言っても、あなたの動機が何であるかについてより具体的にできるなら、より具体的な解決策があるかもしれません。たとえば、グラフについて他に何か知っていますか、O(n(n+m))機能しますか?
ウィリアムマクレイ

私はどこかで問題を見ましたが、追加情報はなく、問題のタイプミスかもしれません。
カラン

1
DAGでトポロジカルソートを行うが、子を使用して到達可能な頂点を追跡する場合、つまりreachable[v]=vchildrenvreachable[v]、その後、ソートされたグラフの最新のアイテムから開始する場合、そして、未使用のエッジを削除し、到達可能な機能を維持することで上がる、これはあなたが除去することが可能にエッジを最大与えるが、私は確かにそれが最大の可能性を取得する場合(それのないよO(|E|+|V|)

回答:


8

各頂点からDFSを実行するだけで、この問題を解決できます。

  1. がの直接の子孫になるように、各頂点、各頂点からDFSを開始します。はエッジです。V V U U V uGvvu(u,v)
  2. 各頂点のためのからDFSによって到達可能な、エッジを削除。 v u v vv(u,v)

上記の全体的な複雑さは、 DFS ' の実行の複雑さであり、これはです。O N N + M NO(N(N+M))


1
漸近的に、これは質問自体にリンクされているウィキペディアの記事のアルゴリズムと同じ複雑さを持っていることに注意してください。O(NM)
デビッドリチャービー

1
同意した。この質問には簡潔な答えが必要だったので、私はそれを提示しました。さらに、ソリューションはIMOです。O(N)
pratyaksh

3

探しているものではありません。ただし、知識を共有するためだけに、各頂点がプロセッサとして機能すると仮定すると、メッセージでそれを行うことができます。各頂点には比較可能な値があることに注意してください。したがって、すべての近傍よりも大きい頂点がいくつか存在します。これらの頂点は次のことを行います。O(|E|)

  1. してみましょう最大の小さな隣人も、vuv
  2. メッセージを送信し、出力にエッジを含めます。v u u(v,u)
  3. すべての隣人のためにのと(との両方よりも小さい)、含まれていません出力に。u v v w wuv(v,w)
  4. 頂点より小さい隣接のすべてのエッジが出力に含まれるか含まれないまで、この手順を繰り返します。(v,v)vv

ノードの場合今すべての大きな隣接(すなわち、すべてのエッジからのメッセージを受信しいずれかで含まれるか含まれていない場合、ノードれる、その近傍で最大であったかのように作用する。すなわち、それは実行します前述の4つのステップ。v(v,v)v

このアルゴリズムは、分散環境でメッセージで終了します。私はこれがあなたが求めているものではないことを知っています。O(|E|)


1

補題:エッジV-> Yがあり、YもVの間接的な後継者である場合(たとえば、V-> W-> + Y)、エッジV-> Yは推移的であり、推移的ルートの一部ではありません。

方法:各頂点の推移的閉包を追跡し、端末から最初の頂点まで逆位相順で作業します。Vの間接的後継者のセットは、Vの直接の後継者の推移的閉包の結合です。Vの推移的閉包は、その間接的後継者とその直接の後継者の結合です。

アルゴリズム:

    Initialise Visited as the empty set.
    For each vertex V of G, 
        Invoke Visit(V).

    Visit(V):
        If V is not in Visited,
            Add V to Visited, 
            Initialise Indirect as the empty set,
            For each edge V -> W in G,
                Invoke Visit(W),
                Add Closure(W) to Indirect.
            Set Closure(V) to Indirect.
            For each edge V -> W in G,
                Add W to Closure(V),
                If W is in the set Indirect,
                    Delete the edge V -> W from G.

これは、頂点のセット(ビットマップなど)を追跡する効率的な方法があることを前提としていますが、この仮定は他のO(V + E)アルゴリズムでも行われていると思います。

潜在的に有用な副作用は、Gの各頂点の推移的な閉包を見つけることです。


以前のアカウントに投稿された回答を削除しました。それでも2つのアカウントを統合する場合は、ヘルプセンターの手順に従ってください。つまり、以前のアカウントには表示されるコンテンツがなくなったため、新しいアカウントに固執することができます。
ジル 'SO-悪であるのをやめる'

0

私は同じ問題を解決しましたが、まったく同じではありませんでした。元の接続された頂点がまだ接続されており、新しい接続が作成されないように、削減後のグラフのエッジの最小数を求めました。 明らかなように、縮小されたグラフを見つけるとは言いませんが、冗長なエッジがいくつあるかを示します。 この問題はO(V + E)で解決できます。説明へのリンクはhttps://codeforces.com/blog/entry/56326です。しかし、実際にグラフを作成すると、O(N)よりも複雑になります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.