如果某些边缘被修复,MST的标准Kruskal方法是否会起作用?

时间:2017-02-13 13:53:50

标签: algorithm graph-theory minimum-spanning-tree kruskals-algorithm

问题:您需要找到图形的最小生成树(即所述图形中的边缘集合S,使得S中的边缘与相应的顶点一起形成树;另外,从所有这样的集合中, S中所有边的成本之和必须是最小的)。但是有一个问题。您将获得一组初始固定边K,以便K必须包含在S中。

换句话说,找到包含一组固定边的图形的MST。

我的方法:标准的Kruskal算法,但在其他任何东西之前加入所有顶点,如固定边缘集所指示的那样。也就是说,如果K = {1,2}, {4,5}我应用Kruskal的算法,而不是最初将每个节点放在它自己的单独集合中,而是节点1和2在同一个集合中,节点4和5在同一个集合中。

问题:这有效吗?有证据证明这总能产生正确的结果吗?如果没有,任何人都可以提供一个反例吗?

P.S。问题只是询问找到一个MST。对所有这些都不感兴趣。

2 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,Prim's algorithm会更适合这个,因为可以将连接的组件初始化为生成的生成树中所需的边缘(加上剩余的孤立的节点)。不允许所需的边包含循环,否则不存在包含它们的生成树。

话虽如此,显然也可以使用Kruskal's algorithm,因为它明确表示可以用来找到以最低成本方式连接两个森林的边缘。

粗略地说,当给定图形的森林形成Matroid时,贪婪的方法会产生所需的结果(即最小权重的树),而不管你开始的independent set

答案 1 :(得分:2)

是的,只要您的初始边缘组不形成循环,它就会起作用。

请记住,生成的树的重量可能不是最小的,因为您修复的边可能不是图中任何MST的一部分。但是你会得到最轻的生成树,它满足那些固定边是树的一部分的约束。

如何实施:

要实现此功能,您只需更改需要修复的边的边权重。只需在图表中选择最低出现的边缘权重,例如min_w,从中减去1并分配这个新权重,即。 (min_w-1)到你需要修复的边缘。然后在此图表上运行Kruskal。

为什么会这样:

显然,在选择图表中的任何其他边缘之前,Kruskal将挑选您需要的所有边缘(因为这些是最轻的)。当Kruskal完成时,得到的边缘集合是G' (您更改了一些权重的图表)。请注意,由于您只更改了固定边集的值,因此算法永远不会在其他边(不是固定集的一部分)上做出不同的选择。如果你想到Kruskal认为的边缘,作为边的排序列表,那么改变你需要修复的边的值会将这些边移动到列表的前面,但它不会改变另一边的顺序。列表中的边相对于彼此。

注意:正如您可能注意到的那样,给您的边缘最轻的重量与您建议的基本相同。但我认为有理由说明它为何有效。随心所欲。

我不推荐使用Prim,因为该算法会从当前连接的组件逐渐扩展生成树(在开始时通常以单个节点开始)。您需要单独处理大型组件(因为您的固定边缘可能不是全部都在一个组件中)的情况 - 可能并不难,但您必须要处理它。 OTOH与Kruskal你不必适应任何事情,只需在运行常规算法之前稍微操纵你的图形。