一道经典题的算法证明

这篇博客讨论了一道关于无向带权连通图的问题,目标是找到恰好有k条黑色边的生成树的最小权值和。通过拓展函数f(x)和S(x)的定义,博主证明了f(x)是凸函数,并使用二分搜索策略寻找最优解。文章详细阐述了证明过程,涉及线性代数和算法知识。
摘要由CSDN通过智能技术生成

Tree I
题目:
给定一个无向带权连通图,每条边是黑色或白色。试求恰好有条 k k k黑色边的生成树的最小权值和。(By WJMZBMR)


一些记号
f ( x ) ≔ f(x)\coloneqq f(x):=恰好有 x x x条黑色边的生成树的最小权值和
S ( x ) ≔ S(x)\coloneqq S(x):=所有黑色边权值减去 x x x之后的MST的值
f f f是定义在 N \N N上的函数,但我们可以对其拓展, ∀ x ∈ N \forall x\in\N xN,将 ( x , f ( x ) ) (x,f(x)) (x,f(x)) ( x + 1 , f ( x ) ) (x+1,f(x)) (x+1,f(x))相连,从而将 f f f拓展到 [ 0 , + ∞ ] [0,+\infty] [0,+]


凸函数性质讨论
直觉上, f f f应该是凸函数,因此先探讨下假如 f f f是凸函数时具有哪些性质。
将所有 ( x , f ( x ) ) (x,f(x)) (x,f(x))用直线连接起来,可以得到一个凸包。上下凸包只需要以 x x x轴为对称轴对称即可互相转换,不失一般性,下述只讨论下凸包的情况。
如下图,任取一条直线 y = k x + b y=kx+b y=kx+b,假设直线与凸包交于点 ( x 0 , f ( x 0 ) ) (x_0,f(x_0)) (x0,f(x0)),把点代入直线可得截距 b = f ( x 0 ) − k x 0 b=f(x_0)-kx_0 b=f(x0)kx0。用这条直线去切这个凸包,一定可以切到一个最优解的点(即一个拐点),并且这时候截距 b b b取最小值,即函数 g ( x ) = f ( x ) − k x g(x)=f(x)-kx g(x)=f(x)kx取最小值。
注意,直线切到的可能是多个最优解的点,例如下图 A , B , C A,B,C A,B,C三点共线的情况,以斜率为 k A C k_{AC} kAC的直线去切凸包,会与这三点重合。
图1

那么,对一个给定的 k k k,若求出 f ( x ) − k x f(x)-kx f(x)kx [ x 1 , x 2 ] [x_1,x_2] [x1,x2]处取得最小值 g ( x 1 ) g(x_1) g(x1),则 [ x 1 , x 2 ] [x_1,x_2] [x1,x2]处的最优解 f ( x ) = g ( x ) + k x , x ∈ [ x 1 , x 2 ] f(x)=g(x)+kx,x\in[x_1,x_2] f(x)=g(x)+kx,x[x1,x2]
再考虑上图,由于是一个下凸包,所以对每一个最优解的点,都存在满足上述性质的直线,并且直线的斜率是随着 x x x递增的。因此若要求 x 0 x_0 x0处的最优解,只要二分斜率 k k k,解出 g ( x ) g(x) g(x)取最小值时的解集,直到这个解集包含 x 0 x_0 x0,即可求出最优解 f ( x 0 ) f(x_0) f(x0)
事实上,按照上述讨论,有可能不存在整数 k k k,使得解集内包含 x 0 x_0 x0,那二分的斜率就必须为浮点数。但是该题的情况比较特殊,如果 f ( x 0 ) = f ( x 0 − 1 ) = f ( x 0 + 1 ) f(x_0)=f(x_0-1)=f(x_0+1) f(x0)=f(x0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值