0
這裏的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,它的形容詞列表表示如下:
1:2, 4
2:5
3:1
4:
5:
它應該是這樣的:
3 ---> 1 ---> 2 ---> 5
|---> 4
然後根據t3他的僞代碼,π[1]應該是NIL,並且對於π[3]是一樣的。 但顯然,π[1]應該是3,對嗎? 我錯過了什麼嗎?
PS:我提出這個問題的原因是,我在做使用dfs的拓撲排序。 我的想法是:1.找到每個頂點的父項,即π[u],2.檢查每個π[u],如果π[u] == 0,則u有0個indegree,並將u放入有序列表中。
嗯,我不明白的是,如果我從1開始進行排序,那麼根據僞代碼,π[1]是零,並且π[1]將在後來的上升時保持零(我的意思是topsort(2,3,4,...)),但在我的圖中,有一個邊緣<3,1>,我可以說1的父母應該是3不是零? – Alcott
你的觀察是正確的,如果DFS中的第二個循環從1開始,然後是2,然後是3,依此類推,π[1]最後爲零,並且僞代碼當前被寫入。您可以修改僞代碼以確保每個具有父代的頂點都具有非零π。 –
但是,如果您的主要目標是生成父母列表,那麼結果就是我答案中的鄰接列表。這可以用較簡單的方法來計算。 –