首先我们先要了解什么是树的重心
树的重心定义为树的某个节点,当去掉该节点后,树的各个连通分量中,节点数最多的连通分量其节点数达到最小值。树可能存在多个重心。如下图,当去掉点1后,树将分成两个连通块: ( 2 , 4 , 5 ) (2,4,5) (2,4,5), ( 3 , 6 , 7 ) (3,6,7) (3,6,7),则最大的连通块包含节点个数为3。若去掉点2,则树将分成3个部分, ( 4 ) (4) (4), ( 5 ) (5) (5), ( 1 , 3 , 6 , 7 ) (1,3,6,7) (1,3,6,7)最大的连通块包含4个节点;第一种方法可以得到更小的最大联通分量。可以发现,其他方案不可能得到比3更小的值了。所以,点1是树的重心。
树的重心的一些性质:
- 删除重心后所得的所有子树,节点数不超过原树的1/2,一棵树最多有两个重心,且相邻;
- 树中所有节点到重心的距离之和最小,如果有两个重心,那么它们距离之和相等;
- 两个树通过一条边合并,新的重心在原树两个重心的路径上;
- 树删除或添加一个叶子节点,重心最多只移动一条边。
分析
任选一个节点为根,把无根树变成有根树,然后dp[i]表示以i为根的子树的节点个数。不难发现:
那么假设i是重心,在删除i之后 m a x ( d p [ j ] ) ( j ∈ S o n ( i ) ) max(dp[j]) (j∈Son(i)) max(dp[j])(j∈