algorithm - 深度优先搜索递归算法

标签 algorithm recursion depth-first-search

我正在查看 DFS 伪代码 here

dfs(node start) {
 stack s;
 s.push(start);
 while (s.empty() == false) {
  top = s.top();
  s.pop();
  mark top as visited;

  check for termination condition

  add all of top's unvisited neighbors to the stack.
  mark top as not visited;
 }
}

dfs(node current) {
 mark current as visited;
 visit all of current's unvisited neighbors by calling dfs(neighbor)
 mark current as not visited;
}

为什么作者在访问了所有邻居之后将一个顶点标记为未访问过?这是这里必需的步骤吗?由于我们只是在搜索一个顶点,如果不将该顶点标记为未访问过,它是否会起作用?

另一个链接 here在将顶点设置为已访问后,实际上并没有将其标记为未访问。

最佳答案

当您寻找一个顶点的路径而不是顶点本身时,该顶点应该被标记为未访问。

假设您在遍历后没有将顶点标记为未访问过,并且某些搜索遍历了图的一部分并确实找到了到相关顶点的路径。在某个点,搜索用完了边缘以进行探索,并将其步骤回溯到某个较早的点,然后从那里继续。

如果另一路径指向正在搜索的顶点,该路径穿过在找到的第一条路径上的顶点,则该算法将找不到第二条路径因为它会将公共(public)顶点视为已经访问过。

另一方面,如果您只寻找一条路径(或只寻找一个顶点的存在,即根本没有路径),那么您可以跳过将节点标记为“在离开时”未访问过的步骤。

关于algorithm - 深度优先搜索递归算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13840667/

相关文章:

使用 parallelStream 和 forEach 的 Java 并行化,其中每个部分都是完全独立的

javascript - 为什么我的 MoveZeroes 代码不修改输入数组?

algorithm - HSL插值

c - 我在C编程中遇到错误。 ([Error]预期标识符或 '(' token 之前的 '{')。有人可以帮帮我,让我知道为什么吗?

scheme - Racket 上的回溯问题

algorithm - 如何使用图形表示汉诺塔问题?

python - 使用堆栈替换任意递归?

java - 给定一个整数数组(长度为 n),使用 Java 中的递归查找并返回输入数组的所有子集

java - 用于递归深度优先搜索以存储路径的额外空间

algorithm - 使用深度优先搜索算法解决迷宫问题