找到MST使得特定顶点具有最小程度

时间:2016-01-05 09:24:41

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

给定无向连通图G = {V,E},V(G)中的顶点,标记为v,权重函数f:E-> R +(正实数),我需要找到一个MST使得v的程度很小。我已经注意到,如果所有边缘都具有独特的重量,那么MST是独一无二的,所以我认为它与边缘上的重复权重有关。我虽然关于运行Kruskal的算法,但是在对边缘进行排序时,我总是会考虑在v last上出现的边缘。例如,如果(a,b),(c,d),(v,e)是权重k的唯一边,那么排序边数组中这些边的可能排列是:{(a,b), (c,d),(v,e)}或{(c,d),(a,b),(v,e)}。我在几张图表中运行了这种变化,它似乎有效,但我无法证明这一点。有谁知道如何证明算法是正确的(意义证明v的程度是最小的),或者给出一个相反的算法失败的例子?

1 个答案:

答案 0 :(得分:1)

首先请注意,Kruskal的算法可以应用于任何加权图,无论它是否连接。通常,它会产生最小权重跨越(MSF),每个连接组件有一个MST。为了证明您对Kruskal算法的修改成功找到v具有最小程度的MST,有助于证明稍微强一些的结果,即如果将算法应用于可能断开连接的图形,那么它会成功找到最小化v度的MSF。

证据是通过对不同权重的数字k进行归纳。

基础案例(k = 1)。在这种情况下,可以忽略权重,我们正在尝试查找v度最小化的生成林。在这种情况下,您的算法可以描述如下:根据以下两个规则尽可能长地选择边缘:

  

1)没有选定边形成具有先前选定边的循环

     

2)除非任何边缘没有选择,否则不会选择涉及v的边缘   涉及v违反规则1.

G'表示从v移除G和所有事件边缘的图表。很容易看出,这种特殊情况下的算法的工作原理如下。首先为G'创建生成林。然后,它会将原始图v'sG连接组件中包含的林中的树包含在内,并通过单个边将每个组件连接到v。由于在第二阶段连接到v的组件可以以其他方式相互连接(因为如果存在任何不涉及v的连接边缘,它将被规则2选中)这很容易看v的程度是最小的。

归纳案例:假设k的结果为真,而Gk+1不同权重的加权图,v是{{1}中的指定顶点}}。按递增顺序对不同的权重进行排序(以便权重G是不同权重中最长的权重 - 例如k+1)。设w_{k+1}G'的子图,其顶点集相同但权重G的所有边都已删除。由于边缘按重量增加的顺序排序,请注意修改后的Kruskal算法启动,方法是将自身应用于w_{k+1}。因此 - 通过在考虑权重G'的边缘之前的归纳假设,该算法成功地构建了w_{k+1}的{​​{1}},其F'度{ G'中的{1}}被最小化。

作为最后一步,应用于整体图d'的修改后的Kruskal将通过添加权重v的边缘将G'中的某些树合并在一起。概念化最后一步的一种方法是将G视为一个图,其中当第一棵树中的某个节点到第二棵树中的某个节点存在权重F'的边缘时,两棵树正好相连。树。我们(几乎)有w_{k+1}的基础案例。修改后的Kruskal将添加重量F'的边缘,直到它不再这样做 - 并且不会添加连接到w_{k+1}的边缘,除非没有其他方法连接到需要连接的F'中的树,以获取原始图w_{k+1}的生成林。

结果MSF中v的最终度数为F',其中G是在最后一步添加的权重v的边数。 d = d'+d"d"都不能做得更小,因此w_{k+1}不能做得更小(因为任何跨越森林中d'的程度都是如此可以写为权重小于d"进入d的边数和加权v进入w_{k+1}的边数的总和。)< / p>

QED。

在这方面还有一个挥手的元素,特别是在最后一步 - 但Stack Overflow不是同行评审期刊。无论如何,整体逻辑应该足够清楚。

最后一句话 - 似乎相当清楚Prim的算法可以针对这个问题进行类似的修改。你看过那个吗?