换根DP
作者:互联网
换根\(DP\)属于树形\(DP\),是二次扫描,因为这类问题通常不会指定根结点,并且根节点的变化会对一些值,例如子结点深度和、点权和等产生影响。
通常需要二次\(DFS\),第一次\(DFS\)来处理深度,以及点权和之类的问题,第二次\(DFS\)开始动态规划。
令\(u\)为当前结点,\(v\)为当前结点的叶子结点。首先需要用\(s_i\)来表示以\(i\)为根的子树中的结点个数,并且有\(s_u = 1 + \sum s_v\),那么这个通过一遍\(DFS\)就可以办得到。
考虑状态转移,令\(f_u\)表示以\(u\)为根时,所有结点深度之和,那么进行换根,让\(v\)为根,那么转移就是\(f_v <- f_u\),那么这时候各结点的深度可以分为一下两种情况:
- 所有在\(v\)的子树上的结点深度都减少\(1\),那么总深度之和就减少\(s_v\);
- 所有不在\(v\)的子树上的结点深度都增加\(1\),那么总深度和就增加\(n - s_v\)
那么状态转移方程就可以推出来了,\(f_v = f_u - s_v + n - s_v = f_u + n - 2 * s_v\)。
于是第二遍\(DFS\)处理这个东西就好,这样就能求出以所有结点为根节点的深度和了。
标签:结点,DFS,为根,深度,换根,DP 来源: https://www.cnblogs.com/ZhengLijie/p/15357762.html