DFSと同様のグラフアルゴリズムを必要とします
-
22-09-2019 - |
質問
私は興味があります。ノードが未探索の前任者を持っていることに遭遇した場合、それは戻って検討されている起動するすべてのパスまでの着信パスを追跡する必要があります。
はIグラフアルゴリズムのウィキペディアカテゴリーが見つかりましたが小さな海がありますここアルゴリズムと私はそれらのほとんどに精通していないよ。
編集:例: グラフ{AB、EB、BC、BD}所与として、トラバース:として{A、B、E、B、C、D}または一意順序{A、B、E、C、D}。 なお、第1の開始ノードのすべてのパスが消耗している場合BFSまたはDFSとは異なり、このアルゴリズムは、新たなスタートノードで再び開始する必要はありません。
解決
でDFSは、あなたは通常、uはUから始まるエッジに基づいて後に訪問する頂点を選択してください。あなたはUで終わるの縁に最初に基づいて、選択したいです。これを行うには、転置グラフの情報を持っており、そこから頂点を取得しようとすることができ最初ます。
これは、このようなものになるだろう
procedure dfs(vertex u)
mark u as visited
for each edge (v, u) //found in transpose graph
if v not visited
dfs(v)
for each edge (u, w)
if v not visited
dfs(w)
他のヒント
あなたが探していることはトポロジカルソートです。私は、任意の事前計算せずにそのトポロジー的にソート順にグラフをトラバースする簡単な方法はありません承知している限ります。
topsortを取得するための標準的な方法は、標準のDFSを行い、その後、彼らの訪問回数の順に訪問したノードを格納することです。最後に、これらのノードと出来上がりを逆に、あなたが望む順番でそれらを持っています。
擬似コード:
list topsort
procedure dfs(vertex u)
mark u as visited
for each edge (u, v)
if v not visited
dfs(v)
add u to the back of topsort
リストtopsort
は、あなたがしたいことを逆の順序で頂点が含まれています。ちょうどそれを修正するためにtopsortの要素を逆転ます。
は、あなたがtopological sort
を探しているなら、あなたもこれを行うことができ、隣接リスト(またはあなたが(u,v)
時に前処理することができ、エッジのO(E)
のリスト):
list top_sort( graph in adjacency list )
parent = new list
queue = new queue
for each u in nodes
parent(u) = number of parents
if ( parent(u) is 0 ) // nothing points to node i
queue.enqueue( u )
while ( queue is not empty )
u = queue.pop
add u to visited
for each edge ( u, v )
decrement parent(v) // children all have one less parent
if ( parent(v) is 0 )
queue.enqueue( v )
インクリメントの後、減少に一旦、adjacency list
時間毎に - 各エッジが二回タッチされるのでは(u,v)
(またはエッジO( V + E )
のリスト)を考えると、これは、O(1)
あります。通常のキューでは、各頂点も二回、最大でキューによって処理されます - 。標準キューにO(1)
でも行うことができます。
なお、DFSからこの異なる(少なくともストレートアップ実装)という点で、それは森林を処理する。
もう一つの興味深いメモは、構造/発注のいくつかの並べ替えを課すqueue
でpriority_queue
に置き換えた場合、あなたが実際の結果は、いくつかの順序でソート返すことができるということです。
たとえば、正規のクラスの依存関係グラフ(あなたはクラスYを取った場合にのみ、クラスXを取ることができます)のために
100:
101: 100
200: 100 101
201:
202: 201
あなたはおそらく結果として、になるだろう
100, 201, 101, 202, 200
しかし、あなたは常に最初に小さい番号のクラスを受講することをので、それを変更した場合、あなたは簡単に返すためにそれを変更することができます:
100, 101, 200, 201, 202