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]最后为零,并且伪代码当前被写入。您可以修改伪代码以确保每个具有父代的顶点都具有非零π。 –
但是,如果您的主要目标是生成父母列表,那么结果就是我答案中的邻接列表。这可以用较简单的方法来计算。 –