でDFSについての問題は、あなたの便宜のために、「アルゴリズムイントロ」からコピーした擬似コードである:ここで[グラフ/ DFS]:ここではDAG
DFS(G)
1 for each vertex u ∈ V [G]
2 do color[u] ← WHITE //color changes from WHITE,GRAY,BLACK
3 π[u] ← NIL //π[u] stands for the parent of vertex u
4 time ← 0
5 for each vertex u ∈ V [G]
6 do if color[u] = WHITE
7 then DFS-VISIT(u)
DFS-VISIT(u)
1 color[u] ← GRAY ▹White vertex u has just been discovered.
2 time ← time +1
3 d[u] time //d[u] is the time when u is entered
4 for each v ∈ Adj[u] ▹Explore edge(u, v).
5 do if color[v] = WHITE
6 then π[v] ← u
7 DFS-VISIT(v)
8 color[u] BLACK ▹ Blacken u; it is finished.
9 f [u] ▹ time ← time +1 //f[u] is the time when u is exited
は私の質問です: は、私はDAGを得たと仮定し、次のようにそのADJ-リスト表現は次のとおりです。
1:2, 4
2:5
3:1
4:
5:
それは次のようになりますトンによると、その後
3 ---> 1 ---> 2 ---> 5
|---> 4
彼は擬似コードであり、π[1]はNILでなければならず、π[3]で同じでなければならない。 しかし、明らかに、π[1]は3でなければなりません。 何か不足していますか?
PS:私が疑問を提起する理由は、dfsを使用してトポロジカルソートを行っていたことです。 私の考えは次のとおりです:1.π[u]、すべての頂点の親を見つけます。2.π[u]をすべてチェックします。π[u] == 0ならば、uは0をとります。 。
まあ、私がトップソートを1から始めると、擬似コードに従って、π[1]はゼロになり、π[1]は後のトップソートではゼロになります。 topsort(2,3,4、...))、私のグラフでは、エッジがあります<3,1>、私は1の親は3でなくてはならないと言うことができますか? – Alcott
DFSの2番目のループが1、2、3などで始まる場合、π[1]は擬似コードが現在書き込まれている方法で最後はnilです。擬似コードを変更して、親を持つ各頂点が非ゼロのπを持つようにすることができます。 –
しかし、あなたの主な目標が親リストを生成することである場合、その結果は私の答えに隣接リストです。これはあまり複雑ではないアプローチで計算できます。 –