更正图

时间:2017-07-22 16:53:26

标签: c++ data-structures graph traversal depth-first-search

[问题](http://imgur.com/KHBuDcf

[尝试答案](http://imgur.com/aO0lblA

因为它是DFS遍历的图形,所以我使用了一个堆栈,所以我访问了A,因为它在问题中给出然后我去了B,因为它是有向图然后到C,因为C没有任何其他指示所以我必须回访我的堆栈即B现在我去D现在D要么导致C或者我必须移回我的堆栈所以我移动到B(因为我已经访问过C)B再次耗尽所以我回到A,现在我的A引导我到F并且它是可逆的G,H甚至没有链接所以它是忽略它们的正确方法还是我应该访问它们?什么应该是正确的DFS遍历答案?

2 个答案:

答案 0 :(得分:0)

DFS / BFS背后的概念是,您应该只访问连接的节点,而不是遍历断开的节点,所以访问的节点确实是正确的,您访问的顺序也是正确的,但您应该尝试制作堆栈表示有点清晰,因为很难弄清楚你是如何跟随图像中的堆栈进行尝试的。

答案 1 :(得分:0)

表示DFS遍历的最佳方法是构建相应的生成树。

您问题中的图形图表可以使用邻接列表表示:

A: B, C, F
B: C, D
C:
D: A, C
E: C, G
F: A, C
G: E

从A开始的DFS只会访问A,B,C,D和F并生成以下生成树:

DFS from A

您可以向此树添加未使用的边(因为它们导致已经访问过的顶点而被忽略的边),甚至可以给出它们的分类(前沿,后边和交叉边)。但是生成树可能已经足够了。

更一般的考虑:DFS是一个递归过程(可以使用堆栈进行模拟),可以这样描述:

DFS(g, cur, mark):
  mark[cur] = True
  foreach s in successors of cur in g:
    if not mark[s]:
      DFS(g, s, mark)

但你应该已经知道......

编辑:这是python中的一个简单实现,它生成用于构建数字的点:

https://gist.github.com/slashvar/d4954d04352fc38356f774198e3aa86b