P2619 [国家集训队] Tree I 题解 / WQS 二分学习笔记

· · 题解

:::::info[题目基本信息] 考察:WQS 二分,生成树(提高+/省选-)。
题目简介:
给定一个有 n 个点 m 条边的无向带权图,每条边要么是白色要么是黑色,求需要有 k 条白边前提下的最小生成树总边权,保证有解。
数据范围:

时间限制:2s。
空间限制:500MB。
::::: 先介绍下 WQS 二分。
:::::success[WQS 二分详解] 设有一函数为 f(x),它表示一问题在某一条件为 x 时价值或代价为 f(x),现在我们要求 f(k)
这类问题一般满足:函数 f(x)DD 为定义域)上的最小值好求,同时也好知道该最小值在何处,但 f(x)x 固定时的值不好求,这时我们考虑把 f(x) 转化为整个函数的最小值。
我们钦定 f(x) 为下凸函数,上凸函数同理。画出随便一个 f(x) 的图像:
现在我们要求 C 点通过线性变换转化为整个函数的最小值,由于这是一个凸函数,我们想到用一条直线去切这个函数,就像这样:
这样从函数上的点到直线上的铅垂线的长度变为了变换后函数的值,容易发现此时 C 点成为了函数最小值,这样就可以计算 C 点值了。
实际问题中我们可以二分直线斜率使得快速找到这条切线的斜率,从而得到答案。
::::: 在这道题中,注意到不限制条件时的最小生成树容易得出,所以我们考虑套用 WQS 二分。设 f(p) 为有 p 条白边时的最小生成树总边权,现在我们只需要证明 f(p) 是凸函数,首先我们感性理解下觉得更有可能是下凸函数,因为最小生成树一般不会全是白边或全是黑边。
下面套用下 oi-wiki 的证明:
:::::success[证明] 首先转化一下原问题,由于该函数的定义域为 [0,n-1]\cap\mathbb Z,所以证明该函数为下凸函数等价于证明 \forall i\in(0,n-1)\cap\mathbb Z,f(i)\le\dfrac{f(i-1)+f(i+1)}{2}
不妨钦定图上所有边权均不同,对于有相同的情况,选一个趋近于 0 的正实数 eps,令这些边加上或减去若干个 eps 就转化为了边权均不同的情况,通过极限可以证明边权有相同的情况。
小结论:设同一个图上存在两棵不同的生成树 ST,那么有 \forall e\in S,\exist f\in T,使得 ST 交换 ef 后的两个图 S'T' 仍是生成树。
::::success[证明] 设 e=(u,v)S 删除 euv 断开,由于 T 加上 e 后存在一个环,所以在 T 中可以找到一条在 uv 路径上的一条边,选取任意一条为 f,那么容易证明 T' 是一棵生成树。
对于 S' 考虑反证法,删除 e 后的 S 变成了有两个联通分量的森林,如果没有一个 T 图中在 uv 路径上的 f 使得 S' 是生成树,那么所有的 f 的相连的两个点在 S 中都在一个联通分量里,但是由于 uvS 中在两个连通分量里,那么所有的 fT 中也无法连接 uv,与假设矛盾,故 S' 是一棵生成树。
证毕。
:::: 设 S 是一棵有 i+1 个白边的最小生成树,T 是一棵有 i-1 个白边的最小生成树,选择一条在 S 中但不在 T 中的白边 e,总有一条在 f 中的白边 f 满足交换这两边后 S'T' 还是生成树,对于 f 分类讨论:

证毕。
::::: 为了实现减去直线的操作,我们可以给每条白边的边权减去二分的直线斜率,直接对于每条直线斜率跑一遍 Kruskal 即可,当跑出来的最小生成树白边数量最大值不小于 k 时减小直线斜率,否则增大直线斜率。
一个小优化是容易发现白边和黑边分别保持有序,所以在开始我们将两种边分别排序,跑 Kruskal 时跑一轮归并就可以了。
时间复杂度为 \Theta(m\log m+(n+m)\alpha(n)\log V),其中 V 是边权值域,空间复杂度为 \Theta(n+m)

code