请注意,Kruskal算法可应用于任何加权图,无论它是否连通。一般情况下,它会生成一个最小权重生成森林(MSF),每个连通分量都有一个MST。为了证明你修改后的Kruskal算法成功找到了度数最小的MST,需要证明稍微更强的结果:如果你将算法应用于可能不连通的图,则它可以成功地找到度数最小的MSF。
证明通过对不同权重数量k的归纳进行。
基本情况(k = 1)。在这种情况下,权重可以忽略不计,我们试图找到一个度数最小的生成森林。在这种情况下,你的算法可以描述如下:根据以下两个规则尽可能选择边缘:
1)没有选定的边与先前选定的边形成环路
2)涉及v的边不被选择,除非任何不涉及v的边违反规则1。
让G'
表示从G
中删除v
和所有关联边后的图形。很容易看出,在这种特殊情况下,算法的工作方式如下。它首先为G'
创建一个生成森林。然后,它取出那些在原始图G
中与v
的连通分量相交的森林中的树,并通过一条单独的边将每个组件连接到v
。由于第二阶段连接到v
的组件不能以其他方式彼此连接(因为如果存在不涉及v
的任何连接边,则会按规则2进行选择),因此很容易看出v
的度是最小的。
归纳假设:假设对于
k
结果是正确的,
G
是具有
k+1
个不同权重的加权图形,
v
是
G
中指定的顶点。按升序排序不同的权重(使得权重
k+1
是不同权重中最长的 - 即
w_{k+1}
)。让
G'
成为具有相同顶点集但所有权重为
w_{k+1}
的边被删除的子图
G
。由于边按权重递增的顺序排序,请注意修改后的 Kruskal 算法实际上是通过应用自己到
G'
来
开始。因此 - 在考虑权重为
w_{k+1}
的边之前的归纳假设下,算法已成功地构造了
G'
的 MSF
F'
,其中度数
d'
是在
G'
中最小化的
v
。
作为最后一步,将修改过的Kruskal算法应用于整个图
G
,通过添加权重为
w_{k+1}
的边将
F'
中的某些树合并在一起。一个概念化最后一步的方法是将
F'
视为一个图,当第一棵树中有一条边的权重
w_{k+1}
指向第二棵树中的某个节点时,两棵树就会连接在一起。我们几乎已经有了基础情况的
F'
。修改后的Kruskal算法将添加权重为
w_{k+1}
的边,直到无法再添加为止——除非没有其他方法连接到需要连接以获取原始图
G
生成森林的
F'
中的树,否则不会添加连接到
v
的边。
在生成的最小生成森林中,
v
的最终度数为
d = d'+d"
,其中
d"
是在最后一步添加的权重为
w_{k+1}
的边的数量。既不能使
d'
也不能使
d"
更小,因此可以得出结论,
d
不能再变小了(因为在任何生成树中,
v
的度数可以写成比
w_{k+1}
小的边的数量与权重为
w_{k+1}
的边的数量之和)。
证毕。
尽管最后一步有些牵强附会,但Stack Overflow不是同行评议的期刊。总体逻辑应该足够清晰。
最后一个备注——Prim算法似乎可以类似地修改解决这个问题。你研究过吗?