【总结】一类树上点对匹配问题
基本问题
问题描述
给定 个集合 ,满足任意两个集合 不交,令 ,满足 。
求一组匹配 其中 为无序点对,且满足任意 仅在一个点对中出现。
即求一组匹配,满足任意一对匹配为不同集合间的匹配。
构造算法
定理:有解的充分必要条件为 。
必要性显然,考虑证明充分性。
算法步骤
对于充分性的证明,为一个构造算法:
重复执行以下步骤直到所有集合为空:
令 ,计数器 。
-
若当前存在集合 ,满足 ,在该集合内选取点 ,集合外选取点 ,令匹配集合 ,将点 点 从集合中删除。
-
否则随便选取一对不同集合的点对 ,令匹配集合 。
-
。
算法证明
引理:,满足 。
证明:
对于 时,引理成立。
若 时成立,考虑证明 时也成立。
当我们选一对匹配后, ,因为 时 若 ,那么在选择新的一对匹配后,一定有 。
若 ,因为 的集合至多有两个,所以选择一对新的匹配后一定有 。
故引理成立。
若引理成立,考虑 时,一定有 。
剩下最后一对点匹配即可。
经典问题:无向图加最少边边双连通的下界构造
问题描述
给定无向图 ,令新图 ,图 不存在桥,求满足 最小情况下的一组 。
问题转化
令树 为无向图 进行边双连通分量缩点后的树。
定义非树边边 覆盖树边 当且仅当边 在树上 到 的最短路上。
那么问题即:添加尽量少的边使得树 的每条树边被覆盖至少一次。
令 为 的叶子节点个数,一个经典的结论为 。
下面,给出一种能够构造出下界的构造策略。
朴素构造策略
考虑钦定根节点 ,儿子集合 , ,考虑 , 。
即 分别是 和 子树内的叶子节点。
连边 ,使得所有叶子节点至少连一条非树边。
这样是一定能够满足每条树边被覆盖至少一次的(因为每对 满足 考虑每个点和父亲之间的边,其一定会被子树内叶子节点的某对匹配覆盖)。
那么问题即选取若干对叶子节点的匹配,使其属于根节点的两棵不同子树。
解决匹配问题
考虑找到一个带权重心 ,满足对于任意一棵子树内的叶子个数小于等于 。
可以证明带权重心一定存在,证明类似树分治。
,可以转化成上面的基本问题很轻松的达到下界。
对于 ,可以拿出一个叶子节点后做 规模的问题,然后对于该叶子节点随便连一个点,也可以轻松构造到下界。
扩展练习:P7320 「PMOI-4」可怜的团主
CF468D Tree
题目描述
给定一棵树,边带正权,求排列 ,满足 最大。
求出满足 最大的前提下字典序最小的一组排列。
题解
首先可以将 个点拆成 个点,那么排列的问题可以转化成这 个点的匹配问题。
具体地:令集合 ,求一组 和 的最大带权匹配,匹配 的代价为 。
考虑答案的上界,对于边 的贡献至多为 。
考虑构造出上界,同样钦定重心为根。
类似基本问题构造即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话