来源:JZOJ
题目描述
给定一个 n n n 个点的无权树,求树的重心?
重心定义为,在所有点中,删去该点之后,树中的所有子树的包含节点个数最多的那棵子树包含节点个数最小。
解题思路
- 一种简单粗暴的方法应该可以轻而易举地想出来:枚举每个点,删掉该点,找到树中的所有子树的包含节点个数最多的那棵子树,取最小值;
- 然而,这种方法超时妥妥的。怎么办呢?
- 先来看一张图
- 首先我们定一个数组 s u m sum sum,( s u m [ x ] sum[x] sum[x] 表示以 x x x 为根节点的子树节点个数);和一个数组 m a x p maxp maxp,( m a x p [ x ] maxp[x] maxp[x] 表示删去 x x x 之后,树中的所有子树的包含节点个数最多的那棵子树包含节点个数)
- 根据上图可知,假设红色点为 x x x,那么 s u m [ x ] sum[x] sum[x] 就是 4