在没有哈希表的情况下记录非递归DFS的路径

时间:2016-01-19 01:42:10

标签: algorithm graph depth-first-search

我正在重写我的一些图搜索算法,而且我对DFS有点困惑。看起来当使用调用堆栈作为堆栈时,返回从源到目标的路径很简单 - 只需返回仍在调用堆栈上的节点。

然而,当迭代地实现DFS时,我似乎无法弄清楚如何返回路径。我已经盯着推/弹,访问和当前的模式一段时间了,我不知道该怎么做。

我已经看到一些建议使用哈希表来存储父子关系,但是返回路径的问题肯定不需要O(N)空间。

1 个答案:

答案 0 :(得分:0)

您只需存储当前顶点的前任。然后,您可以使用堆栈恢复路径。

伪代码:

Repeat until you are not in the first vertex:
  Push to the stack current vertex;
  Go to the predecessor;
Your answer will be: current vertex, stack.pop(), stack.pop(), ... (until stack not empty)

示例:

假设在DFS之后,你发现了:

pred[0] = 0;
pred[1] = 0;
pred[2] = 1;
pred[3] = 2;

并想知道从顶点0到顶点3的路径。

  1. current = 3:stack = {3},current = pred [3];
  2. current = 2:stack = {3,2},current = pred [2];
  3. current = 1:stack = {3,2,1},current = pred [1];
  4. current = 0:第一个顶点,现在找到路径。
  5. path = {0},stack = {3,2,1}
  6. path = {0,1},stack = {3,2}
  7. path = {0,1,2},stack = {3}
  8. path = {0,1,2,3},stack = {}
  9. 堆栈为空,返回路径:{0,1,2,3}