Dfs与Bfs混淆

时间:2015-10-29 16:28:09

标签: algorithm graph breadth-first-search depth-first-search

来自topcoder article

  

“在BFS中,当我们将其推入队列时,我们标记了一个被访问的顶点,而不是   我们在DFS的情况下弹出它。“

注意:这是在使用显式堆栈的dfs实现的情况下说的。(伪dfs)。

我的问题是为什么会这样?为什么我们不能标记从队列弹出后访问的顶点,而不是在bfs的情况下推入队列?

1 个答案:

答案 0 :(得分:2)

您的混淆可能来自于过多地考虑树木,但BFS和DFS可以在任何图形上运行。例如,考虑具有类似A-B-C-A的循环的图形。如果从A开始先进行广度优先,则首先将B和C添加到列表中。然后,您将弹出B,除非将其标记为已访问,否则您会将CA添加到列表中,这显然是错误的。如果您先从A开始深入,则会访问B,然后转到C然后转到A,除非A已标记如访问过。

因此,总而言之,无论您采用哪种算法,都需要在第一次看到它时立即标记顶点。但是,如果您只考虑DAG,您会发现事情变得容易一些,因为您根本没有像上面那样的循环。无论如何,重点是你不会陷入循环,因此有多种变体。设置标志是一种方法,检查一组访问的顶点是另一种方式,在某些情况下像树一样,你不需要做任何事情,只需按顺序迭代边缘。