简介
虚树,顾名思义就是不真实的树。
它往往出现在一类树形动态规划问题中。
换句话说,虚树实际就是为了解决一类树形动态规划问题而诞生的!
我们从一道经典的虚树题目入手
[SDOI2011]消耗战
链接:https://www.luogu.org/problemnew/show/P2495
题目大意
给出一棵树,每条边有边权。
有mm次询问,每次询问给出kk个点,问使得这kk个点均不与11号点(根节点)相连的最小代价
n<=250000,m>=1,∑k<=500000n<=250000,m>=1,∑k<=500000(m是smg..)
暴力dp
首先考虑m=1m=1,也就是只有一次询问的情况。我们考虑暴力dp
设f[x]f[x]为处理完以xx为根的树的最小代价
转移分为两种情况
1.断开自己与父亲的联系,代价为从根到该节点的最小值
2.不考虑该节点(前提是该节点不是询问点),把子树内的所有询问点都断开的代价
但是这样的复杂度是O(nm)O(nm)的,显然无法AC
然而我们发现∑k∑k是比较小的,我们可不可以对kk下手呢?
于是,虚树诞生了
虚树
思想
虚树的主要思想是:对于一棵树,仅仅保留有用的点,重新构建一棵树
这里有用的点指的是询问点和它们的lca
煮个栗子
比如这样的一棵树(没错就是样例)
对于样例中的三次询问,
3 2 10 6 4 5 7 8 3 3 9 4 6
那么它的虚树分别长这样
第二张比