12

从概念上讲,图表中的生成树生成森林有什么区别。

另外,是否可以通过DFSBFS遍历构建生成林?为什么?如何?

我了解生成树,但我找不到任何关于生成森林的明确解释。甚至维基百科(https://en.wikipedia.org/wiki/Spanning_tree)也没有给出明确的定义。我的书(Data Structures & Algorithms, Wiley - 第六版)也没有关于跨越森林的定义。

我想知道,如果我们有一个图,例如其中包含三个连接的组件,是否可以通过 DFS/BFS 遍历构建一个跨越森林?

4

2 回答 2

17

当您的 中只有一个连接的组件时graphspanning tree = spanning forest.

connected components但是当你的图表中有多个时。例如在下图中,我们有3 个 connected components.:

在此处输入图像描述

所以对于每一个component,我们都会有一个spanning tree,而这三个 spanning trees将构成spanning forest

我想知道,如果我们有一个图,例如其中包含三个连接的组件,是否可以通过 DFS/BFS 遍历构建一个跨越森林?

对的,这是可能的。当只有 1connected component时,您的BFSorDFS将终止访问所有顶点,您将有一个spanning tree (which in this case is equal to spanning forest).

但是当你有超过 1 时connected component,就像图片中一样,你唯一需要做的就是开始另一个BFS或者DFS从一个未访问的vertex开始。当没有未访问的顶点时,您的算法将终止,并且每个BFSorDFS遍历将产生一个spanning tree.

于 2017-04-06T10:52:32.590 回答
0

即使对于完整的图,也可以通过以下算法构建非平凡的生成森林:

先决条件

  • 所有顶点均未标记
  • 边从 1 到 m 枚举

边缘处理

  • 如果它的两个相邻顶点都被标记,则跳过它,因为那条边要么合并森林的树,要么在其中一棵树中创建一个循环
  • 否则标记其未标记的相邻顶点

算法
按其枚举顺序处理边缘


解释:
虽然在生成树的构造中添加“桥接”连接组件的边是可行的,但在上述算法中没有添加这些边。


解释:
如果边是根据递增长度枚举的,则生成的生成森林的边将是 MST 的子集,森林的树将类似于“盆地”,即边的长度对于创建连接的组件,并随着后续步骤中附加的每条边而增加。
在那种情况下,生成森林的属性可以提供对原始图的结构属性的洞察和/或在算法中使用。

于 2020-09-30T12:09:21.403 回答