基环树专题题解

基环树就是在一颗树上多加条边 在树上形成一个环

一般的做法是把环找出来 然后处理环上挂着的树上的答案

最后来看是 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 n100000

原题是 n ⩽ 5000 n\leqslant 5000 n5000 的 可以枚举断边

加强版不行了

还是先找环

现在我们要求环上要断哪一条边

我们可以模拟这个过程

首先找到 1 1 1 所在的树在环上的位置

可以容易地知道在环上的第一步往哪个方向走

那就先往这个方向走一步

如果挂在这个点的一些树比下一步走到的环上的点字典序小 那么我们就先走这个子树

我们要维护的是 如果下一步 我们选择往回走 那么往回走到的那个节点 最小是多少

如果下一步环上的点大于往回走的点 那么就往回走了

这样就找到了断边

D.new-fzoj3937 创世纪

给出基环内向树森林 每个点指向自己的父亲 要求选尽量多的点 满足选出的点有至少一个儿子没有被选

和骑士那个题差不多 不讲了

posted @ 2022-10-10 20:19  缙云山车神  阅读(25)  评论(0编辑  收藏  举报