【总结】一类树上点对匹配问题
基本问题
问题描述
给定 \(m\) 个集合 \(S_1,S_2...S_m\) ,满足任意两个集合 \(S_i,S_j\) 不交,令 \(n=\sum |S_i|\) ,满足 \(n|2\) 。
求一组匹配 \(M=\{(x_i,y_i) |x_i\in S_k,y_i\in S_j,k\not = j\}\) 其中 \((x,y)\) 为无序点对,且满足任意 \(x\) 仅在一个点对中出现。
即求一组匹配,满足任意一对匹配为不同集合间的匹配。
构造算法
定理:有解的充分必要条件为 \(\max(|S_i|)\le \lfloor \dfrac{n}{2} \rfloor\)。
必要性显然,考虑证明充分性。
算法步骤
对于充分性的证明,为一个构造算法:
重复执行以下步骤直到所有集合为空:
令 \(n'=\dfrac{1}{2}\sum |S_i|\) ,计数器 \(t=0\) 。
-
若当前存在集合 \(S_i\) ,满足 \(|S_i| = n'\) ,在该集合内选取点 \(x\) ,集合外选取点 \(y\) ,令匹配集合 \(M\gets M\bigcup (x,y)\) ,将点 \(x\) 点 \(y\) 从集合中删除。
-
否则随便选取一对不同集合的点对 \((x,y)\) ,令匹配集合 \(M\gets M\bigcup (x,y)\) 。
-
\(t \gets t+1\) 。
算法证明
引理:\(\forall 0\le t\le \dfrac{n}{2}\),满足 \(\max(|S_i|)\le n'\)。
证明:
对于 \(t=0\) 时,引理成立。
若 \(t=k\) 时成立,考虑证明 \(t=k+1\) 时也成立。
当我们选一对匹配后,\(n'\gets n'-1\) ,因为 \(t=k\) 时 \(\max(|S_i|)\le n'\) 若 \(\max(|S_i|)<n'\) ,那么在选择新的一对匹配后,一定有 \(\max(|S_i|)\le n'-1\) 。
若 \(\max(|S_i|)=n'\) ,因为 \(|S_i|=n'\) 的集合至多有两个,所以选择一对新的匹配后一定有 \(\max(|S_i|)=n'-1\) 。
故引理成立。
若引理成立,考虑 \(n'=2\) 时,一定有 \(\max(|S_i|) = 1\) 。
剩下最后一对点匹配即可。
经典问题:无向图加最少边边双连通的下界构造
问题描述
给定无向图 \(G=(V,E)\) ,令新图 \(G'=(V,E\bigcup E')\) ,图 \(G'\) 不存在桥,求满足 \(|E'|\) 最小情况下的一组 \(E'\) 。
问题转化
令树 \(T\) 为无向图 \(G=(V,E)\) 进行边双连通分量缩点后的树。
定义非树边边 \((x,y)\) 覆盖树边 \((u,v)\) 当且仅当边 \((u,v)\) 在树上 \(x\) 到 \(y\) 的最短路上。
那么问题即:添加尽量少的边使得树 \(T\) 的每条树边被覆盖至少一次。
令 \(cnt\) 为 \(T\) 的叶子节点个数,一个经典的结论为 \(\lceil \dfrac{cnt}{2} \rceil\) 。
下面,给出一种能够构造出下界的构造策略。
朴素构造策略
考虑钦定根节点 \(root\) ,儿子集合 \(son\) ,\(|son| > 1\) ,考虑 \(x,y\in son\) ,\(a\in T(x),b\in T(y)\) 。
即 \(a,b\) 分别是 \(x\) 和 \(y\) 子树内的叶子节点。
连边 \((a,b)\) ,使得所有叶子节点至少连一条非树边。
这样是一定能够满足每条树边被覆盖至少一次的(因为每对 \((a,b)\) 满足 \(LCA(a,b) = root\) 考虑每个点和父亲之间的边,其一定会被子树内叶子节点的某对匹配覆盖)。
那么问题即选取若干对叶子节点的匹配,使其属于根节点的两棵不同子树。
解决匹配问题
考虑找到一个带权重心 \(root\) ,满足对于任意一棵子树内的叶子个数小于等于 \(\lfloor \dfrac{cnt}{2} \rfloor\) 。
可以证明带权重心一定存在,证明类似树分治。
\(cnt|2\) ,可以转化成上面的基本问题很轻松的达到下界。
对于 \(cnt \not| 2\) ,可以拿出一个叶子节点后做 \((cnt-1)\) 规模的问题,然后对于该叶子节点随便连一个点,也可以轻松构造到下界。
扩展练习:P7320 「PMOI-4」可怜的团主
CF468D Tree
题目描述
给定一棵树,边带正权,求排列 \(p_1,p_2...p_n\) ,满足 \(\sum dist(i,p_i)\) 最大。
求出满足 \(\sum dist(i,p_i)\) 最大的前提下字典序最小的一组排列。
题解
首先可以将 \(n\) 个点拆成 \(2\times n\) 个点,那么排列的问题可以转化成这 \(2\times n\) 个点的匹配问题。
具体地:令集合 \(S=\{1,2,...,n\},T=\{1,2,...n\}\) ,求一组 \(S\) 和 \(T\) 的最大带权匹配,匹配 \((x,y)\) 的代价为 \(dist(x,y)\)。
考虑答案的上界,对于边 \((x,y)\) 的贡献至多为 \(2\times \min(size[x],size[y])\) 。
考虑构造出上界,同样钦定重心为根。
类似基本问题构造即可。