图DFS检测周期 - (假设)反例

时间:2013-06-08 07:25:26

标签: algorithm graph cycle depth-first-search

因此DFS应检测有向图中的周期。如果它到达之前已经访问过的节点,即它找到了后沿,那么我们就有一个循环。

我找到了一张图表,其中我看不出这是怎么回事。我知道我的思维方式肯定存在缺陷,所以如果有人能帮助我,那就太好了。

所以这是带有邻接列表的图形(绘制它并不完全正常......):

  

A |乙
  B | C,D
  C | ˚F
  D | Ë
  E |
  F | E

假设DFS从A开始,当它到达B时,将D之前的C推送到堆栈,然后它将首先到达节点E,然后将其标记为已访问。然后它将弹出节点C,转到F,然后在F的邻接列表中找到E并且已经访问了E,从而给出了一个循环。但是图中确实没有循环。

我的推理存在哪些缺陷?

1 个答案:

答案 0 :(得分:2)

这里的缺陷是在DFS期间重新访问节点并不一定会产生后沿。它也可以提供交叉边缘或前缘,这就是这种情况。只有当您重新访问的节点已经开始被探索但尚未处理完所有子节点时,才会出现后边缘。在这种情况下,由于E已经处理了它的所有子节点,它第二次遇到的边缘不是后边缘,所以不应报告周期。

希望这有帮助!