DAGが与えられた場合に推移的削減を見つけるためのO(V + E)アルゴリズムを探しています。
これは、可能な限り多くのエッジを削除するため、uからvに到達できる場合、任意のvおよびuに対して、エッジの削除後も到達できます。
これが標準的な問題である場合は、モデルの解決策を示してください。
DAGが与えられた場合に推移的削減を見つけるためのO(V + E)アルゴリズムを探しています。
これは、可能な限り多くのエッジを削除するため、uからvに到達できる場合、任意のvおよびuに対して、エッジの削除後も到達できます。
これが標準的な問題である場合は、モデルの解決策を示してください。
回答:
各頂点からDFSを実行するだけで、この問題を解決できます。
上記の全体的な複雑さは、 DFS ' の実行の複雑さであり、これはです。O (N (N + M ))
探しているものではありません。ただし、知識を共有するためだけに、各頂点がプロセッサとして機能すると仮定すると、メッセージでそれを行うことができます。各頂点には比較可能な値があることに注意してください。したがって、すべての近傍よりも大きい頂点がいくつか存在します。これらの頂点は次のことを行います。
ノードの場合今すべての大きな隣接(すなわち、すべてのエッジからのメッセージを受信しいずれかで含まれるか含まれていない場合、ノードれる、その近傍で最大であったかのように作用する。すなわち、それは実行します前述の4つのステップ。
このアルゴリズムは、分散環境でメッセージで終了します。私はこれがあなたが求めているものではないことを知っています。
補題:エッジ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の各頂点の推移的な閉包を見つけることです。
私は同じ問題を解決しましたが、まったく同じではありませんでした。元の接続された頂点がまだ接続されており、新しい接続が作成されないように、削減後のグラフのエッジの最小数を求めました。 明らかなように、縮小されたグラフを見つけるとは言いませんが、冗長なエッジがいくつあるかを示します。 この問題はO(V + E)で解決できます。説明へのリンクはhttps://codeforces.com/blog/entry/56326です。しかし、実際にグラフを作成すると、O(N)よりも複雑になります