【问题标题】:Edge classification in a DFSDFS 中的边分类
【发布时间】:2011-11-13 17:54:09
【问题描述】:

根据书(Intro to Algorithm),在dfs中,边分为4种:

  1. 树边缘,如果在边缘 (u,v) 中,首先发现 v,然后 (u, v) 是 树的边缘。
  2. 后边,如果......,v 已经被发现并且 v 是祖先,那么它就是后边。
  3. Forward Edge,如果......,v 已经被发现并且 v 是 u 的后代,那么它就是。
  4. Cross Edge,除上述三个之外的所有边。

我的问题是,当我试图确定 (u, v) 是后沿还是前沿时,如何确定 v 是 u 的祖先还是后代?

【问题讨论】:

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


【解决方案1】:

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

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

  • 如果设置了entry(u)而未设置exit(u),则u是当前顶点的祖先(即vu是后边)
  • 如果entry(u)>entry(current),则u是当前顶点的后代(current->u是前边)
  • 否则,它是一个交叉边缘

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2016-02-08
    • 2023-03-21
    • 2019-11-20
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多