树形 DP树链剖分(decomposition)
WZH 树链剖分(decomposition)
定义一个树的一种树链剖分的权值为:所有 (u,v)(u≤v) 之间的经过轻边的个数的和。
定义一个树的最优树链剖分为权值最小的树链剖分。
给定 n 个点的树。
对于每一个节点 i,求以 i 为根的情况下的最优树链剖分的权值。
n≤105。
显然的换根 DP,于是我们先考虑单次树形 DP 怎么求。
首先我们应该拆贡献:对于每一条边 (u,v),其中 u 是 v 的父亲,那么共有 szv(n−szv) 个路径经过它。那么只要其不是重边,答案就要累加这个值。
于是我们定义 fx 表示考虑 x 子树内的所有边的贡献的最小权值,则有:
fx=u∑fu+u∑szu(n−szu)−umax{szu(n−szu}
设 d1,x,d2,x 表示 x 子树内最大次大的 szu(n−szu)。同时定义 D1,x,D2,x 为达到 d1,x,d2,x 的儿子。
直接模拟可以做到 O(n2)。
然后就是换根 DP(多画图,不然很可能看不懂下面的)。
不妨设 gx 表示以 x 为根时的 DP 值,且我们现在要从 gx 转移到 gu。
那么 gu 应该分为 5 个部分:
- fu+d1,u,因为 d1,u 可以变化,通过 u→x 这条边进行更新。
- −max{d1,u,szu(n−szu)},这里就是利用 u→x 这条边更新。注意,这次的通过父节点的更新应该永久的带到 u 的子树中,因为以 u 子树为根时依然有 u→x 这条边。
- szu(n−szu),因为要加上 u→x 这条边的贡献。
- gx−fu−szu(n−szu)+d1,x:要加上 u→x 的贡献。同时 gx 需要去掉 u 这一部分。并且,由于去掉了 u 子树,d1,x 可能更新。
- −{d1,xd2,xD1,x=uD1,x=u。
然后模拟即可 O(n)。