基环树专题题解
基环树就是在一颗树上多加条边 在树上形成一个环
一般的做法是把环找出来 然后处理环上挂着的树上的答案
最后来看是 d p dp dp 还是递推一下求答案
考验调程序的能力 (像我这种调程序困难户每次都写对拍慢慢调 毕竟菜
A.「ZJOI2008」骑士
给出一个基环树森林 要求选尽量多的点 满足选出来的点两两之间没有边
首先找环
然后处理环上挂着的树 求出一颗树上 根节点选和不选 各自可以取最多节点数
最后在环上两次 d p dp dp
第一次强行不选环上的第一个点要选 得到 a n s ans ans
第二次强行不选第二个点 更新 a n s ans ans
把所有基环树答案加起来 就可以了
B.「IOI2008」Islands
给出一个基环树森林 求所有基环树最长链之和
找环
处理树上的答案 略
考虑环上
把长度为 n n n 环复制一遍 形成长度为 2 n 2n 2n 的链
每次要找前面的点中 到自己的距离+外向树的深度 最大的点
这个可以 d p dp dp
发现其中距离是递增的 可以单调队列优化
C.「NOIP2018」旅行 加强版
给出一个基环树 可以从任意一个点出发 前往一个相邻未访问过的结点 或者沿第一次访问当前结点的边返回 要求找出一个访问方案 使得每个结点都被访问过 且方案的字典序最小 n ⩽ 100000 n \leqslant 100000 n⩽100000
原题是 n ⩽ 5000 n\leqslant 5000 n⩽5000 的 可以枚举断边
加强版不行了
还是先找环
现在我们要求环上要断哪一条边
我们可以模拟这个过程
首先找到 1 1 1 所在的树在环上的位置
可以容易地知道在环上的第一步往哪个方向走
那就先往这个方向走一步
如果挂在这个点的一些树比下一步走到的环上的点字典序小 那么我们就先走这个子树
我们要维护的是 如果下一步 我们选择往回走 那么往回走到的那个节点 最小是多少
如果下一步环上的点大于往回走的点 那么就往回走了
这样就找到了断边
D.new-fzoj3937 创世纪
给出基环内向树森林 每个点指向自己的父亲 要求选尽量多的点 满足选出的点有至少一个儿子没有被选
和骑士那个题差不多 不讲了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】