bfs 或 dfs 什么时候添加一个节点访问?

When do you add a node to visited in bfs or dfs?

嘿,我一直在研究 BFS/DFS,我注意到其中很多都有细微的修改,那就是在将节点添加到访问集时。

在一种方式中,算法将从 stack/queue 中弹出节点,然后将其添加到访问集。然后它将添加所有未访问过的邻居

在另一种实现中,节点没有添加到那里的访问集。相反,它会将所有尚未访问过的邻居添加到 stack/queue,但它会在将这些邻居添加到 stack/queue.

时将其添加到已访问的集合中

总而言之,在一种方法中,当它们弹出到 stack/queue 时,它们被添加到访问集。在另一种方法中,当它们被添加到 stack/queue.

时,它们被添加到访问集

我的两个问题是:两者有什么区别?我应该使用哪一个?

如果我只在弹出它时将它添加到访问对象并且图中有循环,我可以看到会发生一些问题,但我对此也不是 100% 确定。任何帮助将不胜感激。

两者具有相同的算法复杂性和正确性。

但是,在开始遍历邻居之前标记一个已访问的顶点稍微慢一些。 在 BFS 的情况下,这意味着将相同的顶点多次冗余地添加到队列中。 在 DFS 的情况下,这意味着在同一个顶点上多次冗余调用 dfs 函数。

因此,我个人总是喜欢在将顶点添加到 stack/queue 之前将其标记为已访问。