“在BFS中,当我们将其推入队列时,我们标记了一个被访问的顶点,而不是 我们在DFS的情况下弹出它。“
注意:这是在使用显式堆栈的dfs实现的情况下说的。(伪dfs)。
我的问题是为什么会这样?为什么我们不能标记从队列弹出后访问的顶点,而不是在bfs的情况下推入队列?
答案 0 :(得分:2)
您的混淆可能来自于过多地考虑树木,但BFS和DFS可以在任何图形上运行。例如,考虑具有类似A-B-C-A
的循环的图形。如果从A
开始先进行广度优先,则首先将B和C
添加到列表中。然后,您将弹出B
,除非将其标记为已访问,否则您会将C
和A
添加到列表中,这显然是错误的。如果您先从A
开始深入,则会访问B
,然后转到C
然后转到A
,除非A
已标记如访问过。
因此,总而言之,无论您采用哪种算法,都需要在第一次看到它时立即标记顶点。但是,如果您只考虑DAG,您会发现事情变得容易一些,因为您根本没有像上面那样的循环。无论如何,重点是你不会陷入循环,因此有多种变体。设置标志是一种方法,检查一组访问的顶点是另一种方式,在某些情况下像树一样,你不需要做任何事情,只需按顺序迭代边缘。