查找 MST 以使特定顶点具有最小度数

Posted

技术标签:

【中文标题】查找 MST 以使特定顶点具有最小度数【英文标题】:Finding MST such that a specific vertex has a minimum degree 【发布时间】:2016-01-05 09:24:40 【问题描述】:

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

【问题讨论】:

1.我将首先证明 Kruskal 算法可以生成每个可能的 MST(算法的执行完全由具有相同权重的边的顺序决定)。 2. 然后我会将 Kruskal 算法的任何执行与您建议的执行进行比较,我会尝试得出结论,您的执行产生较少的边缘事件v 【参考方案1】:

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

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

基础案例 (k = 1)。在这种情况下,可以忽略权重,我们试图找到一个生成森林,其中v 的程度最小化。在这种情况下,您的算法可以描述为:根据以下两条规则尽可能长时间地选择边缘:

1) 没有选中的边与之前选中的边形成一个循环

2) 不选择涉及v 的边,除非任何边不 涉及v 违反规则1。

G' 表示已从G 中删除v 和所有事件边的图。很容易看出,这种特殊情况下的算法工作如下。它首先为G' 创建一个跨越森林。然后它获取原始图中G 中的v's 连接组件中包含的森林中的那些树,并通过一条边将每个组件连接到v。由于在第二阶段连接到v 的组件不能以其他方式相互连接(因为如果存在任何不涉及v 的连接边,它会被规则2 选择)很容易看出v 的度数最小。

归纳案例:假设k 的结果为真,并且G 是具有k+1 不同权重的加权图,vG 中的指定顶点。按升序对不同的权重进行排序(这样权重k+1 是不同权重中最长的——比如w_k+1)。让G' 成为G 的子图,具有相同的顶点集,但删除了所有权重为w_k+1 的边。由于边是按权重递增的顺序排序的,请注意修改后的 Kruskal 算法实际上开始通过将自身应用于G'。因此——通过在考虑权重边缘w_k+1 之前的归纳假设,该算法成功地构造了G' 的MSF F',其中vv 的度d' 最小化.

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

生成的 MSF 中v 的最终度数是d = d'+d",其中d" 是在最后一步添加的权重w_k+1 的边数。 d'd" 都不能变小,因此d 不能变小(因为任何生成森林中v 的度数都可以写成权重小于w_k+1 的边进入v,权重w_k+1 的关闭边数进入v)。

QED。

这其中仍然有挥手的元素,尤其是在最后一步时——但 Stack Overflow 不是同行评审的期刊。反正整体逻辑应该够清晰了。

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

【讨论】:

以上是关于查找 MST 以使特定顶点具有最小度数的主要内容,如果未能解决你的问题,请参考以下文章

构建覆盖特定顶点子集的最小生成树

删除最小数量的顶点以使所有顶点隔离

度限制MST

为啥在 Prim 的 MST 算法中得到最小顶点?

最小生成树

通过从每个顶点中选取最小边缘的MST算法?