DFS中的边缘分类

时间:2011-09-09 11:56:18

标签: graph-theory depth-first-search edge

根据书(算法简介),在dfs中,边被分为4种:

  1. 树边缘,如果在边缘(u,v),v首先被发现,那么(u,v)是 树边。
  2. Back Edge,如果......,v已经被发现而v是一个祖先,那么它就是一个后缘。
  3. 前进边缘,如果......,v已经被发现而v是你的后代,它就是前沿。
  4. Cross Edge,除上述三个外的所有边缘。
  5. 我的问题是,当我试图找出(u,v)是后边缘还是前边缘时,如何识别v是你的祖先还是后代?

1 个答案:

答案 0 :(得分:19)

如果您确实需要它,可以通过维护每个节点的所谓进入和退出时间来检查它。在算法运行期间,每次遇到新顶点时,都会递增time变量(当然从0开始)。最初未设置所有顶点的时间entry_t(v)exit_t(v)

首次遇到顶点时,设置entry(v):=time。当您通过上边缘退出顶点(即从堆栈弹出顶点)时,设置其exit(v):=time。有了这个,你有

  • 如果设置entry(u)并且未设置exit(u),那么u是当前顶点的祖先(即.vu是后边缘)
  • if entry(u)>entry(current),那么你是当前顶点的后代(current-> u是前沿)
  • 否则,它是一个交叉边缘

请注意,这些关系用于在算法运行期间进行检查。算法完成后,检查祖先基本上是

u is_descendant_of v = entry(u)>entry(v) and exit(u)<=exit(v)