生成树VS.跨越森林

时间:2017-04-06 10:31:46

标签: algorithm graph-theory depth-first-search breadth-first-search spanning-tree

概念上,图表中的生成树生成林之间有什么区别。

此外,是否可以通过 DFS BFS 遍历构建生成林?为什么?怎么样?

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

我想知道,如果我们有一个包含例如三个连通组件的图表,是否可以通过DFS / BFS遍历构建生成林?

2 个答案:

答案 0 :(得分:10)

graph中只有一个连接的组件时,spanning tree = spanning forest

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

enter image description here

因此,对于每个component,我们会有一个spanning tree,所有 3 spanning trees将构成spanning forest

  

我想知道,如果我们有一个图表,例如三个连接   其中的组件,是否可以构建一个生成森林   DFS / BFS遍历?

是的,这是可能的。如果只有connected component BFS,则DFSspanning tree (which in this case is equal to spanning forest)将终止访问所有顶点,您将拥有connected component

但是当你有超过1 BFS时,就像在图片中一样,你唯一需要做的就是从未访问的顶点开始另一个DFSBFS < / strong>即可。当没有未访问的顶点时,您的算法会终止,每个DFSspanning tree遍历将产生Intl

答案 1 :(得分:0)

甚至可以通过以下算法为完整的图构建非平凡的跨越式森林:

前提条件

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

边缘处理

  • 如果两个相邻的顶点都被标记,请跳过该边缘,因为那样一来该边缘将合并森林中的树木或在其中一棵树木中创建一个循环
  • 否则标记其未标记的相邻顶点

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


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


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