【问题标题】:Determine if a tree is a DFS Tree判断一棵树是否为 DFS 树
【发布时间】:2017-04-24 14:38:39
【问题描述】:

问题如下:

我们知道一个图可能有许多可能的 DFS 树,具体取决于起始顶点和 我们探索每个顶点的邻居的顺序。
给定一个连通图 G = (V, E),给定一棵有根树 T,使得这棵树的每条边都是 存在于 E 中。设计一个有效的算法来确定 T 是否是 G 的 DFS 树。

“树 T 不是 DFS 树”是什么意思(假设它跨越整个图)?

如果我在邻接表表示中没有任何树顶点排序(我假设问题本身就声称),我可以以任何方式遍历并创建问题中给出的树。

编辑:我想我开始了解“非 DFS 树 T”,它只是跨越但不可能在任何可能的 DFS 中创建的树,因为我们有一个限制,即必须访问所有孩子在返回父级之前首先在 DFS 树中。尽管如此,任何人都可以帮助使用高效的算法。

例如:

A -- B
/  \
C - D

这个图有一个树 T:
A -- B
/  \
C                                  /

但这不是一个有效的 DFS 树!
DFS 从顶点 A 开始。

提前致谢!

【问题讨论】:

  • T 是深度优先搜索树 (DFS),这就是它的意思
  • 你能告诉我这个问题What is the meaning of "tree T is not a DFS Tree" 的相关性,就像问题T is a DFS tree of G中所说的那样
  • 如果我能弄清楚哪棵树不是我就能弄清楚哪棵树是。

标签: algorithm tree


【解决方案1】:

DFS 不能唯一确定结果标签的事实是由于访问节点的子节点没有顺序。据我了解,检查给定图G 的树T 是否是DFS 树可以如下完成。

T 中找到一个标签最小的节点;这将是当前节点v,此时它是开始 DFS 搜索的根。将v 标记为已访问。

递归处理Gv 的未访问子代。如果这些与T 中的不同,则T 不是G 的DFS 树。如果它们相同,则按照它们在T 中的 DFS 编号的升序处理它们,照常分配 DFS 编号并标记访问过的节点。每当分配的 DFS 编号与 T 中的 DFS 编号不匹配时,树 T 就不能是 G 的 DFS 树。另一方面,如果可以分配所有 DFS 编号以匹配 T 中的编号,我们已经建设性地证明了 TG 的 DFS 树。

【讨论】:

  • 这在一种特殊情况下会失败:A : B;乙:C,D; C:D; D:C;如果我从 A 开始,检查树 DFS 编号是:A(1)、B(2)、C(3)、D(4)。我们无法区分给定的 T 和 DFS 树。自:A:B;乙:C,D;乙:乙; D B;我猜不是 DFS 树。
  • ^ T 和 DFS 树的 DFS 编号相同,但我猜 T 不是 DFS 树。
  • @Akash 请更准确地描述图和树;在你的符号A : B 中,你的意思是A 有孩子B 吗?您在评论末尾提到的图表不是树,因为它包含一个循环。
  • 请看上面问题的编辑部分,我已经说得很清楚了。
  • @Akash 感谢您的澄清;我忽略了这一点。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多