给出了一个图从顶点0开始的深度优先生成树,然后如何求出最小生成树啊
首先根据深度优先生成树构造图,然后依次从这个图中尝试移除权重最大的边,如果移除后会有节点断开,那么就不移除这条边,直到所有的边都试一遍
我们现在来考虑如何将图转换为树,这样的话就可以按照树的一些操作方式来对图进行操作。我们考虑两种生成的方式:深度优先和广度优先。对于无向图来说,深度优先生成树就是按照深度优先遍历的方式,将图中经过的顶点进行记录得到的树就是深度优先生成树。广度优先生成树就是记录广度优先遍历经过的顶点来形成一棵树。对于图来说,其节点的发生和延伸是没有规律可循的,杂乱的。我们将其表达为树的形式可以在一定程度上使得数据的发展有规律可循。
例如下面我们对图1中的无向图采用深度优先生成的树为图2的样式,采用广度优先生成的树为图3的样式。
当然,对于非连通图来说。我们采用深度优先和广度优先生成的是多棵树组成的森林,然后可以用我们前面提到的孩子兄弟表示法将其转换为一棵树。
如果你已经有了一个从顶点0开始的深度优先生成树,你可以使用以下算法来实现最小生成树(Minimum Spanning Tree):
Kruskal算法:Kruskal算法是一种基于边的贪心算法。按照边的权重按照边选择的顺序进行,并保证选择的边不会形成环路。重复这个过程,直到生成树中包含了所有的顶点。
Prim算法:Prim算法是一种基于顶点的贪心算法。从任意一个顶点开始,选择与当前生成树连接的最小权重的边,将其添加到生成树中,并扩展生成树。重复这个过程,直到生成树中包含了所有边界。
在你的情况下,已经有了一个深度优先生成树,你可以使用Prim算法来启动最小生成树。你可以按照以下步骤进行:
创建一个空的最小生成树(MST)和一个已访问的顶点集合,将顶点0添加到已访问的中。
从生成树的边集合中选择一条具有最小权重的边,该边连接一个已经在访问中的顶点和一个未在访问中的顶点。将边添加到MST中,将目标顶点添加到访问中。
步骤重复2,直到访问中包含了所有的边缘。
返回最小生成树MST。
请注意,如果你的深度优先生成树不是初始化图,你可能需要先非重置部分,然后对每个处理重置部分应用Prim算法来初始化最小生成树。