概念上,图表中的生成树和生成林之间有什么区别。
此外,是否可以通过 DFS 或 BFS 遍历构建生成林?为什么?怎么样?
我理解生成树,但我找不到任何关于跨越森林的明确解释。甚至维基百科(https://en.wikipedia.org/wiki/Spanning_tree)也没有给出明确的定义。 我的书(数据结构和算法,Wiley - 第六版)也没有关于跨越森林的定义。
我想知道,如果我们有一个包含例如三个连通组件的图表,是否可以通过DFS / BFS遍历构建生成林?
答案 0 :(得分:10)
当graph
中只有一个连接的组件时,spanning tree = spanning forest
。
但是当图表中有多个connected components
时。例如,在下图中,我们有 3 connected components
。:
因此,对于每个component
,我们会有一个spanning tree
,所有 3 spanning trees
将构成spanning forest
我想知道,如果我们有一个图表,例如三个连接 其中的组件,是否可以构建一个生成森林 DFS / BFS遍历?
是的,这是可能的。如果只有connected component
BFS
,则DFS
或spanning tree (which in this case is equal to spanning forest)
将终止访问所有顶点,您将拥有connected component
。
但是当你有超过1 BFS
时,就像在图片中一样,你唯一需要做的就是从未访问的顶点开始另一个DFS
或BFS
< / strong>即可。当没有未访问的顶点时,您的算法会终止,每个DFS
或spanning tree
遍历将产生Intl
。
答案 1 :(得分:0)
甚至可以通过以下算法为完整的图构建非平凡的跨越式森林:
前提条件
边缘处理
算法
按其枚举顺序处理边缘
解释:
尽管在生成树的构造中添加“桥接”连接的组件的边是可行的,但在上述算法中不添加这些边。
解释:
如果根据递增长度枚举边缘,则生成的跨越林的边缘将是MST的子集,并且林木将类似于“盆地”,即,对于创建所连接组件的边缘,其长度最小并随后续步骤中附着的每个边缘而增加。
在这种情况下,跨越森林的属性可以提供对原始图的结构属性的洞察力和/或在算法中的利用。