【题解】[HNOI2015] 落忆枫音
感觉这题挺有意思的,遂写。
题目大意
给出一个有向无环图,再给定两个点 和 ,表示在点 和 间加上一条边。求这个图有多少种生成树。
题目分析
首先考虑不加边之前的情况,假设给定下面这个图:
根据树的定义,除根节点外的节点有且只有一个父亲节点,也就是说对于每一个节点,我们要指定一个唯一的父节点。比如上图的点 ,它在生成树上的父节点可以是 或者 。又因为每个节点取父节点的情况互不干扰且是个无环图,所以用乘法原理可得生成树的方案有 。 表示点 的入度,也就是有 个父节点可能。
再考虑加上一条边后可能有环的情况。将上图添加一个由 到 的有向边。
此时,点 ,, 形成一个环。我们发现,即使现在点 ,但它的合法方案只有 ,因为它的父节点不能为点 ,否则会形成环,不符合树的定义。
所以最后的方案数就等于所有方案数减去成环的方案数,而要使一个可以成环的点集成环,它有且只有一种方案,即每个节点的父节点都是上一个环上的点。如上图,若 的父节点是 , 的父节点是 ,但 的父节点是 的话,这时候不会形成一个环。
令集合 包含所有在环内的点,得出最后的结论:
我们令 表示从 到 的含环数量,用拓扑排序维护转移。初始值 ,状态转移 ( 可达 )。可以这样理解这个状态转移,由于多了一条 的边,所以所有从 到 的路径上的点必然处于一个这条路径加上 所形成的环上,每次转移一次就相当于除上一个在环上的 值,最后的 就是所有有环的方案数。
最后注意由于 到 多加了一条边,所以 要加一。但拓扑排序时 要减回来,否则不一定能遍历到它在环上。
总结
遇到在一个较简单的基础上增添一些性质的题,可以从简单的基础上出发,最后再减去不合法方案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下