根据书(算法简介),在dfs中,边被分为4种:
我的问题是,当我试图找出(u,v)是后边缘还是前边缘时,如何识别v是你的祖先还是后代?
答案 0 :(得分:19)
如果您确实需要它,可以通过维护每个节点的所谓进入和退出时间来检查它。在算法运行期间,每次遇到新顶点时,都会递增time
变量(当然从0开始)。最初未设置所有顶点的时间entry_t(v)
,exit_t(v)
。
首次遇到顶点时,设置entry(v):=time
。当您通过上边缘退出顶点(即从堆栈弹出顶点)时,设置其exit(v):=time
。有了这个,你有
entry(u)
并且未设置exit(u)
,那么u是当前顶点的祖先(即.vu是后边缘)entry(u)>entry(current)
,那么你是当前顶点的后代(current-> u是前沿)请注意,这些关系用于在算法运行期间进行检查。算法完成后,检查祖先基本上是
u is_descendant_of v = entry(u)>entry(v) and exit(u)<=exit(v)