【AGC035E】Develop(图论,DP)
对于某个集合 ,考虑能不能删去 。
对于任意 ,连边 (如果 )及 (如果 ),那么能把 删去当且仅当这张图是一个 DAG。
于是我们先对所有点都这么连边形成图 ,那么 合法当且仅当 在 中的导出子图是个 DAG,即无环。
对于所有 的边,它们形成了两条链,分别称为奇链和偶链。然后我们对 的奇偶性分类讨论:若 是偶数,那么这两条链是不连通的(独立的),而无环相当于要求每条链中不连续选 个点,这个方案数很好统计(注意数据范围不大,暴力 DP 即可)。
若 是奇数,情况就复杂些。首先,若出现了环,那么一定经过了正偶数条 的边(经过一次会改变一次当前点的奇偶性)。接下来我们证明,一个简单环必定只经过了恰好 条 的边。
对于任意一个简单环 ,取其编号最小的点 ,那么环中 的上一个点一定是 ,下一个点一定是 (记为 )。而且我们发现,对于 中的任意一个点 , 在环中都不可能是 得到的(否则 不是最小点),于是我们已经可以确定 的一部分形态,如上图左上。
接着, 在环中接下来肯定是先走若干步 (可以是 步,但不能超过 )走到 ,然后再走一步 走到 ,如上图左下。
接着,如上图右,我们又继续考虑 这个点是从哪来的,若它是 得到的,那么就必然要经历从 右侧到 左侧的过程(从 经过若干步到达 ),这个过程中一定会再次经过 中的某一个点,这就与该环是简单环矛盾了。从而, 是从 来的。类似地,可以推出 中的每一个点 都是从 来的,这就和 接起来了。
于是 只有可能是 的形态。
那么,现在限制改为了, 在 中的导出子图不能出现环,且该环恰经过两次 ,如下图左上。
假设 已经选好了,怎么快速判断是否存在这样的环:可以从每个 中的奇数编号的点 开始,按如下方式找一条路径(称为 的找环路)并检查:
-
找到最小的 使得 。
-
找到最小的 使得 且 。若找不到这样的 那么跳过从 开始的检查。
-
找到最小的 使得 。
-
考虑路径 ,若 长度大于等于 ,那么我们就找到了一个环。
如上图左下,图中的红蓝两条路径就是从两个不同的 开始的找环路。
容易证明,按照上述方式,若找不到任何一个环,那么图中就确实不存在环(因为从我们所述的 跳到 ,是能使得 的长度尽量大的)。
那么考虑 DP。如上图右,设 表示考虑完 中的奇数点和 中的偶数点,其中从 开始的找环路经过的点数为 ,而从 开始不断 所能经过的点的个数为 的方案数。
转移的时候,考虑从 开始的找环路(假设 ):若 且存在从 开始的找环路,那么从 转移过来;否则从 转移过来。转移是 的。
时间复杂度 ,注意 DP 时若 我们可以直接把它看做 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通