算法目的:给出 V0,K 和一个带边权的无向图,求出在 V0 的度数最多为 K 的限制下的最小生成树
预备知识:最小生成树、动态规划
定义:强制K度最小生成树为所有生成树中
大概思路:先把
定理:任意强制K+1度最小生成树一定可以由某个强制K度最小生成树替换一条边得到
定理的证明:我们可以把强制K度最小生成树想象成
易知,不存在
(Ai,Bi)
在同一棵树中。因为如果有,则两个生成树中至少有一个不是最小生成树
同理,也不存在
(Ai,Bi)
跨越不同的树。
所以可以得出所有的
(Ai,Bi)
满足
Ai=V0
或
Bi=V0
又因为经过替换之后
V0
的度数只增加了1,所以若加入了X条这样的边,就必须删掉X-1条这样的边
由于原来的树是强制K度最小生成树,所以一定不存在在某棵树中换一个点与
V0
相连使得答案变小的情况
所以可以得出,所有的这样添加和删除操作必然都是在同一棵树中进行的
可以证明原来这棵树与
V0
相连的边一定不会被替换掉,所以X-1=0,X=1
也就是说,强制K+1度最小生成树是从强制K度最小生成树删一条边再加一条边产生的
证毕
有了这个定理,我们就可以更加快速的求出强制K度最小生成树了
算法步骤:1.先求出
M
,并对每个联通快求出一个最小生成树,然后选择一个权值最小的边使其和
2.然后考虑求强制M+1度最小生成树,根据定理,这个生成树是由上一个生成树替换一条边得到。当我们加入
(V0,S)
时,我们一定会选择删除现在从
V0
到
S
路径上边权最大的那个,所以我们O(N)扫一遍所有点,进行一次DP,求出从
3.接着扫一遍所有没被加入的与 V0 相连的边,选择一条加入之后最优的边(边权-被替换掉的边权最小),把它加入进来,然后把原来的边加入,这就得到了强制M+1度最小生成树
4.重复上面的过程,直到求出了强制K度最小生成树,则最小K度限制生成树一定在这些答案当中
算法复杂度:最开始求出最小生成树O(ElogE),接着进行K次替换,每次替换需要O(N)DP,再O(E)比较。所以总的时间复杂度为 O(ElogE+K(N+E))
代码?等我写了再贴吧