首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[图形/ dfs ]:关于DAG中的dfs的问题

[图形/ dfs ]:关于DAG中的dfs的问题
EN

Stack Overflow用户
提问于 2011-09-10 11:21:46
回答 1查看 775关注 0票数 0

为了方便起见,下面是从“算法简介”中复制的伪代码:

代码语言:javascript
复制
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-list表示如下:

代码语言:javascript
复制
1:2, 4
2:5
3:1
4:
5:

它应该看起来像这样:

代码语言:javascript
复制
3 ---> 1 ---> 2 ---> 5
       |---> 4

然后根据伪代码,π1应该是零,π3也是如此。但是显然,π1应该是3,对吧?我是不是遗漏了什么?

PS:我提出这个问题的原因是,我正在使用dfs进行拓扑排序。我的想法是:1.找到每个顶点的父节点,即πu,2.检查每个顶点u,如果是πu==0,则u有0个π,并将u放在有序列表中。

EN

回答 1

Stack Overflow用户

发布于 2011-09-10 13:46:52

对于使用深度优先搜索计算拓扑排序,DAG中的边指向依存关系的方向(例如,在您的示例中,1取决于3)。

因此,要进行拓扑排序,您需要提供一个DAG,其中包含与示例相反的边:

代码语言:javascript
复制
1: 3
2: 1
3:
4: 1
5: 2

使用此图,您可以执行DFS,从一个用于存储拓扑排序的空列表开始。顶点v的DFS完成后,将v追加到列表中。这可以通过添加

代码语言:javascript
复制
l ← []

DFS的第4行之后,其中l存储拓扑排序,以及

代码语言:javascript
复制
l.append(u)

DFS-VISIT的第8行之后。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7369400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档