树的重心
Contents
定义
树的重心是指:
在一棵无权无根树中,对于每一个点
性质
-
点
为重心 以 为根时,所有子树大小 -
重心至少有一个,最多有两个。
2.1. 如果有两个重心,那么它们之间一定有一条边相连,且此时树一定是有偶数个节点,且存在一种方式分割成两棵树,使得这两个重心分别为两棵树的重心。
-
点
为重心 树中所有点到某个点的距离和中,到 的距离和是最小的。3.1. 如果有两个重心,那么到它们的距离和一样。
-
把两棵树通过一条边相连得到一棵新的树,那么新的树的重心在连接原来两棵树的重心的路径上,并且新重心会落在较大的树那边。
-
在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
证明
-
:如果存在一个重心使得某个子树大小 ,那么向着这个子树的方向移动一条边,一定能找到一个更优的重心。 :当以 为根时,如果所有子树大小 ,那么它的任意邻居 不可能比 更优,因为以 为根时, 所在子树的大小会 。 -
易证一个和两个的情况,如果有
个重心,易证每两个重心之间一定有一条边相连,而这样的话会形成一个大小为 的环,不可能是树。2.1. 有两个重心意味着有两个大小为
的子树。 -
设点
到所有其他点的距离为 ,那么如果存在一个邻居 使得 所在子树的大小 ,那么移动到 一定有 (因为贡献的点数量 )。由此可以推出,除了重心以外的点都至少存在一个邻居使得 更小,可以得出重心的 最小。 -
WLOG 假设两棵树一大一小,可以看作将小子树一个个作为叶子的加入到大子树上,此时重心会沿着连接的点方向移动。
-
易证。
例题
例1 CF1406C. Link Cut Centroids
题意
给定一棵树,我们需要切掉一个edge,再加上一个edge,使得新生成的仍然是一棵树,并且仅有一个重心。
求出这样的方案,答案一定存在。
其中,
题解
首先判断重心是不是有
如果是,那么设两个重心分别为
证明:易证
代码
|
|
例2 CF685B. Kay and Snowflake
题意
给定一棵有根树(
其中,
题解
结论:考虑
如果在它重儿子(设为
所以我们可以从下往上处理每个子树的重心,处理到
可证每个点最多会被跳
代码
|
|