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
∀x∈N,将
(
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的直线去切凸包,会与这三点重合。

那么,对一个给定的
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−1)=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(x0−1),由于边的权值都是整数,只要纵坐标不同,则其差至少为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(x0−1)∣≥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
∣k1−k2∣=∣f(x0−1)−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}
rk1≤lk2。
假设命题不成立,对
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
∣k1−k2∣<δ,
∣
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))−(k1x1−k2x2)=S(k1)−S(k2)。令
k
2
→
k
1
k_2\rightarrow k_1
k2→k1,由
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是凸函数。
这篇博客讨论了一道关于无向带权连通图的问题,目标是找到恰好有k条黑色边的生成树的最小权值和。通过拓展函数f(x)和S(x)的定义,博主证明了f(x)是凸函数,并使用二分搜索策略寻找最优解。文章详细阐述了证明过程,涉及线性代数和算法知识。
834

被折叠的 条评论
为什么被折叠?



