理论
换根 $dp$ 通常在 不指定根节点,且根节点的不同对于所求值有影响时 使用
套路的,有以下步骤:
- 任意的指定根节点
- 对于当前的有根树,做一次树形 $dp$ ,并将状态转移到上面
- 从第一次的根开始做 $dfs$ ,计算转移后的阶
例题
P6419 [COCI2014-2015#1] Kamp
一棵树上有 $K$ 个人集中在同一点,需要将这 $K$ 人分别送回,对于 $i=1\sim n$ ,如果集中在 $i$ 最少需要多少时间
题面描述并不是太清楚,但手玩样例会发现司机最后不需要返回到聚会点
$dfs1$
考虑子树内的部分如何统计:设 $g_u$ 表示从 $u$ 点开始将 $u$ 子树内的人全部送回家并返回 $u$ 的方案数
显然有 $g_u=\sum_{v\ is\ subtree\ of\ u} g_v+2\times w_{u,v}$
再考虑到司机不需要回到出发点,那么最后的答案需要减去离聚会点距离最远的一个人的距离
那么还需要存从当前点出发的最长链 $len_u$
$dfs2$
从全局的考虑,设 $f_u$ 表示以点 $u$ 为聚会点送人并最后回到 $u$ 的最短距离,那么有:
对于最长链,考虑在 $dfs1$ 中维护另一个次长链便于转移
1 | const int N=5e5+100; |
P3647 [APIO2014]连珠线
从一个珠子开始,每次可以用以下一种方式添加一个新珠子:用红线与一个珠子连起来;将两个被红线链接的珠子之间插入一个新珠子,并用蓝边链接两边两个
每条边有边权,得分是所有蓝线长度之和,只给出珠子和链的连接方式,但不告诉颜色,求最大可能得分
有一个结论是:蓝线中点的形式一定是形如 sonx-x-fax
而不是 sonx-x-sonx
先假定一个根,设 $f_{i,0/1}$ 表示点 $i$ 是否是蓝线中点,以 $i$ 为根的子树中得到的最大值
那么有转移:
再考虑如何换根:
当一个点的儿子变成父亲时:儿子的贡献消失,转移方程中的最大值可能不存在,所以记录次大值
设 $dp_{i,0/1,j}$ 表示 $f_{i,0/1}$ 统计中,不考虑第 $j$ 个儿子所得的答案,对于 $dp_{i,0,j}$ 直接减去,对于 $dp_{i,1,j}$ 用次大值维护
1 | const int N=2e5+100; |
P4228 [清华集训2017] 榕树之心
起初时,树上只有一个点,心也在一号点,之后每一步树会长出一个新节点,心会沿着其到新节点的简单路径走一步,不同的生长顺序会时心最终位置不同,求哪些点可能时心最后在的位置
对于任意点 $x$ ,心最后在 $x$ 的必要条件为 $depth_x+n$ 是奇数
再考虑如何使心在根节点:显然当根的所有子树大小都小于 $\left\lfloor\frac{n}{2} \right\rfloor$ 时,心可能在根节点
那么当有一子树大小大于 $\left\lfloor\frac{n}{2} \right\rfloor$ 时,根可能被拉到该子树中,但也可能仍会在根节点中(例如当该子树是一个菊花图时)
考虑维护子树内 心的深度:设 $f_i$ 表示 $i$ 子树中,心与 $i$ 相对深度的最小值,显然 $f_i$ 与 $Size_i$ 始终具有不同的奇偶值
设 $i$ 的子树中子树大小最大的是 $c$ 子树,那么有:
若 $Size_c\leq \left\lfloor\frac{Size_i}{2} \right\rfloor$
则心可以被拉回,$f_i=(Size_i+1)\mod 2$
否则
心可能在 $c$ 子树中,设 $rest=Size_i-Size_c-1$
若 $f_c\leq rest$ ,则心能拉回来,仍有 $f_i=(Size_i+1)\mod 2$
若 $f_c>rest$ ,此时仍要尽力去拉,则有 $f_i=f_c-rest+1$
那么当 $f_0=1$ 时,心在根节点
再考虑换根过程:
对于每个点,先考虑 $depth_x+n$ 的奇偶性
对于根从 $1$ 转移到 $x$ 的情况,此时 $x$ 上方可以看成另一个子树
那么换根时,对于每个点 $x$ ,求出其上面的子树大小
与 $1$ 为根时类似的,考虑 $x$ 中 $\max\{Size_c\}$ 的子树 $c$ ,比较 $rest$ 与 $f_c$ 的关系即可
1 | const int N=1e5+100; |