深度优先搜索递归算法

时间:2012-12-12 13:15:47

标签: 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实际上并未将顶点设置为访问后未访问过。

1 个答案:

答案 0 :(得分:4)

当您寻找路径到顶点而不是顶点本身时,顶点应标记为未访问。

想象一下,在遍历之后,您不会将顶点标记为未访问,并且某些搜索会遍历图形的一部分并找到相关顶点的路径。在某些时候,搜索用完了边缘来探索和回溯它的步骤到某个早期的点,从那里继续。

如果有另一个路径到被搜索的顶点,该路径通过找到的第一条路径上的 的顶点,则该算法将找不到第二条路径因为它会将公共顶点视为已经访问过的。

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