一道经典题的算法证明

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

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(x01)=f(x0+1),则用 k = 0 k=0 k=0的直线就能切到,否则若 f ( x 0 ) ≠ f ( x 0 + 1 ) f(x_0)\neq f(x_0+1) f(x0)=f(x0+1) f ( x 0 ) ≠ f ( x 0 − 1 ) f(x_0)\neq f(x_0-1) f(x0)=f(x01),由于边的权值都是整数,只要纵坐标不同,则其差至少为1,即 ∣ k 1 ∣ = ∣ f ( x 0 ) − f ( x 0 − 1 ) ∣ ≥ 1 |k_1|=|f(x_0)-f(x_0-1)|\geq 1 k1=f(x0)f(x01)1 ∣ k 2 ∣ = ∣ f ( x 0 ) − f ( x 0 + 1 ) ∣ ≥ 1 |k_2|=|f(x_0)-f(x_0+1)|\geq 1 k2=f(x0)f(x0+1)1,以及 ∣ k 1 − k 2 ∣ = ∣ f ( x 0 − 1 ) − f ( x 0 + 1 ) ∣ ≥ 2 |k_1-k_2|=|f(x_0-1)-f(x_0+1)|\geq 2 k1k2=f(x01)f(x0+1)2。因此在 k 1 , k 2 k_1,k_2 k1,k2之间必然存在至少一个整数, k k k取这个整数时即可在 x 0 x_0 x0处与这个凸包相切。
从而在该问题中,只需要二分整数斜率即可。


证明 f f f是凸函数
先探讨一下 S ( x ) S(x) S(x)的一些性质。假设 S ( k ) S(k) S(k)对应的生成树选了 x x x条黑边,则这个边集在原图上的权值和为 S ( k ) + k x S(k)+kx S(k)+kx,不难发现这个形式与上述的 f ( x ) f(x) f(x) g ( x ) g(x) g(x)的关系具有相似性,因此不妨猜想,若 S ( k ) S(k) S(k)对应的生成树选了 x x x条黑边,则 f ( x ) = k x + S ( k ) f(x)=kx+S(k) f(x)=kx+S(k)
下面来证明这个猜想:
由于 S ( k ) S(k) S(k)对应的生成树也是原图的一个生成树,因此 f ( x ) ≤ k x + S ( k ) f(x)\leq kx+S(k) f(x)kx+S(k)。假设 f ( x ) < k x + S ( k ) f(x)<kx+S(k) f(x)<kx+S(k),则存在一个 x x x条黑边的生成树,其权值和为 f ( x ) f(x) f(x),将其边权减去 k k k之后,权值和为 f ( x ) − k x < S ( k ) f(x)-kx<S(k) f(x)kx<S(k),这与 S ( k ) S(k) S(k)的定义矛盾,故 f ( x ) = k x + S ( k ) f(x)=kx+S(k) f(x)=kx+S(k)
对给定的 k k k,取满足上式的最小和最大的 x x x分别为 l k , r k l_k,r_k lk,rk。接着证明,若 k 1 < k 2 k_1<k_2 k1<k2,则 r k 1 ≤ l k 2 r_{k_1}\leq l_{k_2} rk1lk2
假设命题不成立,对 k 1 < k 2 k_1<k_2 k1<k2,存在 x 1 > x 2 x_1>x_2 x1>x2,使得 f ( x 1 ) − k 1 x 1 = S ( k 1 ) , f ( x 2 ) − k 2 x 2 = S ( k 2 ) f(x_1)-k_1x_1=S(k_1),f(x_2)-k_2x_2=S(k_2) f(x1)k1x1=S(k1),f(x2)k2x2=S(k2),则取 k 1 , x 1 k_1,x_1 k1,x1时的生成树在黑边减去 k 2 k_2 k2情况下的权值和 f ( x 1 ) − k 2 x 1 < S ( k 2 ) f(x_1)-k_2x_1<S(k_2) f(x1)k2x1<S(k2),这与 S ( k ) S(k) S(k)的定义矛盾,由反证法原理,命题成立。
接着可以猜想给定 k k k后,得到 l k , r k l_k,r_k lk,rk,那么对任意 x ∈ [ l k , r k ] x\in[l_k,r_k] x[lk,rk],都有 f ( x ) − k x = S ( k ) f(x)-kx=S(k) f(x)kx=S(k),即把所有黑边权值减去 k k k之后,必存在一棵MST,其黑边数量为 x x x
为了证明这个猜想,先要引入两个MST的性质。
①一张无向图上的所有MST的边权集合是相同的。直观的来说,把MST的边按权值分类,每一类的个数是固定的。
②一张无向图上的不同MST中,某一种权值的边全部连接完后,形成的连通块的连通性是一样的。
因此,由性质②,我们考虑会被选中的权值 p p p,先删去所有权值为 p p p的边,对得到的图进行缩点,再恢复所有删去的边,此时这张图的边权都是相同的,由性质①,这张图任选一个生成树,都是可以构成原图MST的边集。
假设在新的图的所有生成树中,黑边数量最少为 l ′ l' l,最多为 r ′ r' r。我们对此图进行归纳假设。假设存在黑边数量为 x x x的一个生成树,考虑任意加一条未选中的黑边,此时会形成一个唯一的环,若这个环中存在一条白边,那么将这条白边删去,即可得到一个黑边数量为 x + 1 x+1 x+1的生成树。若对所有黑边数量为 x x x的生成树,任选未选中的黑边,所在的环都是全部都是黑边的环,就说明选择的黑边已达数量上限,即 x = r ′ x=r' x=r。因此 ∀ x ∈ [ l ′ , r ′ ] \forall x\in [l',r'] x[l,r],都存在黑边数量为 x x x的生成树。
由于性质②,只要选择的是一个MST的边集的子集,则不同边权的边的选择不会互相影响,假设将不同边权的边分类为边集 E 1 , E 2 , . . . , E s E_1,E_2,...,E_s E1,E2,...,Es,则对每类边集 E i E_i Ei,都有一个黑边可选的区间 [ l i ′ , r i ′ ] [l'_i,r'_i] [li,ri],可以任选 x ∈ [ l i ′ , r i ′ ] x\in [l'_i,r'_i] x[li,ri],因此 l k = ∑ i = 1 s l i ′ , r k = ∑ i = 1 s r i ′ l_k=\sum_{i=1}^sl'_i,r_k=\sum_{i=1}^sr'_i lk=i=1sli,rk=i=1sri,且其中的任何数都可选。
之后,我们再考虑是否所有 x x x都被上述性质覆盖了。先证明 S S S是一个连续函数。
设N为节点数, ∀ ϵ > 0 \forall \epsilon>0 ϵ>0,取 δ = ϵ N \delta=\frac{\epsilon}{N} δ=Nϵ,对任意 ∣ k 1 − k 2 ∣ < δ |k_1-k_2|<\delta k1k2<δ ∣ S ( k 1 ) − S ( k 2 ) ∣ < N ϵ N = ϵ |S(k_1)-S(k_2)|<N\frac{\epsilon}{N}=\epsilon S(k1)S(k2)<NNϵ=ϵ,从而 S S S一致连续。
假设存在 x 0 x_0 x0,不存在 k k k使得 f ( x 0 ) − k x 0 = S ( k ) f(x_0)-kx_0=S(k) f(x0)kx0=S(k)。设 x < x 0 x<x_0 x<x0且存在 k k k,使得 f ( x ) − k x = S ( k ) f(x)-kx=S(k) f(x)kx=S(k)的最大的 x x x x 1 x_1 x1。设满足 f ( x 1 ) − k x 1 = S ( k ) f(x_1)-kx_1=S(k) f(x1)kx1=S(k)的最大的 k k k k 1 k_1 k1,取 k 2 > k 1 k_2>k_1 k2>k1,设满足 f ( x ) − k 2 x = S ( k 2 ) f(x)-k_2x=S(k_2) f(x)k2x=S(k2)的最小的 x x x x 2 x_2 x2,有 x 1 < x 0 < x 2 x_1<x_0<x_2 x1<x0<x2,且 ( f ( x 1 ) − f ( x 2 ) ) − ( k 1 x 1 − k 2 x 2 ) = S ( k 1 ) − S ( k 2 ) (f(x_1)-f(x_2))-(k_1x_1-k_2x_2)=S(k_1)-S(k_2) (f(x1)f(x2))(k1x1k2x2)=S(k1)S(k2)。令 k 2 → k 1 k_2\rightarrow k_1 k2k1,由 S S S的连续性, f ( x 2 ) − k 1 x 2 = f ( x 1 ) − k 1 x 1 = S ( k 1 ) f(x_2)-k_1x_2=f(x_1)-k_1x_1=S(k_1) f(x2)k1x2=f(x1)k1x1=S(k1),这与 x 1 x_1 x1的定义不符,从而对任意 x x x,都存在 k k k使得 f ( x ) − k x = S ( k ) f(x)-kx=S(k) f(x)kx=S(k)
综上,这些性质覆盖了所有的 x x x
整理上述所有结论,由于 f f f是连续的,且由上述讨论,可以被等效成一系列斜率递增的线段的并,因此 f f f是凸函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值