虚树
简介¶
虚树就是在原有的树的基础上将没有贡献的信息去除从而进行压缩后得到的树,它往往被应用于一系列的树形 DP 问题上。
引入¶
题目描述¶
在一场战争中,战场由 \(n\) 个岛屿和 \(n-1\) 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为 \(1\) 的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他 \(k\) 个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到 \(1\) 号岛屿上)。不过侦查部门还发现了这台机器只能够使用 \(m\) 次,所以我们只需要把每次任务完成即可。
朴素做法¶
dfs 一遍然后在每个结点处对每个计划进行 DP,复杂度 \(\mathcal{O}(nm)\) ,显然不行。应该如何优化?
优化做法¶
不妨设在当前询问中被选中的结点为关键点,那么会对这次询问产生贡献的结点只有 1 号结点、关键点以及他们中某些结点的 LCA,同时 \(\Sigma k_i\) 较小,考虑对每次询问在压缩信息后的「虚树」上进行 DP。
虚树¶
虚树的建立参考 虚树 - OI Wiki # 虚树 Virtual Tree 中的图。
也没太多好写的。。。后面懒得写了(~o ̄3 ̄)~