最小K度限制生成树

来源:互联网 发布:苹果软件安装助手 编辑:程序博客网 时间:2024/06/05 11:15

算法目的:给出V0,K和一个带边权的无向图,求出在V0的度数最多为K的限制下的最小生成树

预备知识:最小生成树、动态规划

定义强制K度最小生成树为所有生成树中V0的度数为K的权值最小的生成树

大概思路:先把V0V0有关的边都删除,假设现在的图分成了M个联通块,则我们可以得知对于任何生成树V0的度数至少为M。那么我们依次求出强制M度最小生成树强制M+1度最小生成树强制K度最小生成树,这些生成树的最小值就是最小K度限制生成树

定理:任意强制K+1度最小生成树一定可以由某个强制K度最小生成树替换一条边得到

定理的证明:我们可以把强制K度最小生成树想象成V0连着K颗树,设新加入的边为(A1,B1),(A2,B2)

易知,不存在(Ai,Bi)在同一棵树中。因为如果有,则两个生成树中至少有一个不是最小生成树
同理,也不存在(Ai,Bi)跨越不同的树。
所以可以得出所有的(Ai,Bi)满足Ai=V0Bi=V0

又因为经过替换之后V0的度数只增加了1,所以若加入了X条这样的边,就必须删掉X-1条这样的边
由于原来的树是强制K度最小生成树,所以一定不存在在某棵树中换一个点与V0相连使得答案变小的情况
所以可以得出,所有的这样添加和删除操作必然都是在同一棵树中进行的
可以证明原来这棵树与V0相连的边一定不会被替换掉,所以X-1=0,X=1
也就是说,强制K+1度最小生成树是从强制K度最小生成树删一条边再加一条边产生的
证毕

有了这个定理,我们就可以更加快速的求出强制K度最小生成树

算法步骤:1.先求出M,并对每个联通快求出一个最小生成树,然后选择一个权值最小的边使其和V0相连,这就是强制M度最小生成树

     2.然后考虑求强制M+1度最小生成树,根据定理,这个生成树是由上一个生成树替换一条边得到。当我们加入(V0,S)时,我们一定会选择删除现在从V0S路径上边权最大的那个,所以我们O(N)扫一遍所有点,进行一次DP,求出从V0到所有点的路径最大权值是多少

     3.接着扫一遍所有没被加入的与V0相连的边,选择一条加入之后最优的边(边权-被替换掉的边权最小),把它加入进来,然后把原来的边加入,这就得到了强制M+1度最小生成树

     4.重复上面的过程,直到求出了强制K度最小生成树,则最小K度限制生成树一定在这些答案当中

算法复杂度:最开始求出最小生成树O(ElogE),接着进行K次替换,每次替换需要O(N)DP,再O(E)比较。所以总的时间复杂度为O(ElogE+K(N+E))

代码?等我写了再贴吧

0 0