Algorithm Dfs与Bfs混淆

Algorithm Dfs与Bfs混淆,algorithm,graph,breadth-first-search,depth-first-search,Algorithm,Graph,Breadth First Search,Depth First Search,从a: “在BFS中,我们在将顶点推入队列时标记访问的顶点,而不是作为 如果出现DFS,我们会将其弹出。” 注意:这是在使用显式堆栈(伪dfs)实现dfs时说的 我的问题是为什么会这样?为什么我们不能在从队列弹出后标记访问的顶点,而不是在bfs情况下推到队列上?您的困惑可能是因为考虑太多树,但是bfs和DFS可以在任何图形上运行。例如,考虑一个带有循环的代码: AB B-C-A。如果从A开始选择宽度优先,则首先将B和C添加到列表中。然后,您将弹出B,除非它们被标记为已访问,否则您将在列表中添加C

从a:

“在BFS中,我们在将顶点推入队列时标记访问的顶点,而不是作为 如果出现DFS,我们会将其弹出。”

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


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

您的困惑可能是因为考虑太多树,但是bfs和DFS可以在任何图形上运行。例如,考虑一个带有循环的代码:<代码> AB B-C-A。如果从
A
开始选择宽度优先,则首先将B和
C
添加到列表中。然后,您将弹出
B
,除非它们被标记为已访问,否则您将在列表中添加
C
A
,这显然是错误的。如果您先从
A
,然后访问
B
,再从那里访问
C
,然后访问
A
,除非
A
已标记为已访问


总之,无论采用哪种算法,只要第一次看到顶点,就需要将其标记为可见。但是,如果你只考虑DAGs,你会发现事情变得简单一点,因为在那里你没有像上面那样的循环。不管怎么说,关键是你不会陷入一个循环中,而且有多种变体。设置标志是一种方式,检查访问的顶点集是另一种方式,在某些情况下,如树,您不需要做任何事情,只需按顺序迭代边。

您知道BFS与DFS的区别吗?如果您查看每个节点的维基百科页面,则访问节点的顺序会有很大差异。@JB King是的,我知道。在这里,我问它只有在案件的BFS。通过一些示例,我发现这两种方法(从队列弹出后标记visited或推到队列前标记visited)都给出了相同的结果(按级别遍历)。那么,为什么选择本文中提到的方法而不是另一种方法呢?“无论采用哪种算法,都需要在第一次看到顶点时立即将其标记为可见的顶点”,所以这对DFS也是有效的,不是吗?是的。这样做是为了在由于循环第二次到达该顶点时设置停止标志。