作用
当不同结点作为根结点时,状态转移的结果不一样,若枚举每个点作为根结点再DP,时间复杂度会很高。
这种情况下,使用换根DP处理相邻两个结点之间的贡献,达到快速换根的效果。
使用场景
对于一棵树,寻找以某个点 cur 为根结点取得的最大值或最小值或方案数。
实现步骤
-
任选 1 点作为根结点(比如结点 11),跑一遍树形 DP,得到 dp_i 表示以 ii 为根结点的子树的 XXX 的最大值或最小值或方案数。
-
f_1=dp_1,其中 f_i 表示以 ii 为全局根结点时 XXX 的最大值或最小值或方案数。
-
从根结点(上述中我们用 1 来举例)再次 DFS 遍历,从父结点到子结点转移得到 f_ifi。
例题
Ⅰ:P3478 POI 2008 STA-station
很板的一道换根 DP 题。
分析
-
定义 dp_cur 表示以 cur 为根的子树的结点的全局(以固定点为根结点)深度之和。转移很好想:dp_{cur}+=dp_{nxt}。
-
初始状态:dp_{cur}=dep_{cur},其中 dep_{cur} 表示 cur 结点的深度。
-
定义 f_ifi 表示以 ii 为全局根结点的结点深度之和。很显然答案输出 f_ifi 的值最大的 ii。
-
考虑从上往下的转移,如从 cur 遍历子结点到 nxt。
-
虽然这题可以省略,但为了养成好习惯,f_1=dp_1。
-
记得开
long long
。