树的重心
定义
如果在树中选择某个节点并删除,这棵树将分为若干棵子树,统计子树节点数并记录最大值。取遍树上所有节点,使此最大值取到最小的节点被称为整个树的重心。
(这里以及下文中的「子树」若无特殊说明都是指无根树的子树,即包括「向上」的那棵子树,并且不包括整棵树自身。)
性质
- 树的重心如果不唯一,则至多有两个,且这两个重心相邻。
- 以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。
- 树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么到它们的距离和一样。
- 把两棵树通过一条边相连得到一棵新的树,那么新的树的重心在连接原来两棵树的重心的路径上。
- 在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
求法
在 DFS 中计算每个子树的大小,记录「向下」的子树的最大大小,利用总点数 - 当前子树(这里的子树指有根树的子树)的大小得到「向上」的子树的大小,然后就可以依据定义找到重心了。
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
例题
Codeforces Round 359 (Div. 1) B. Kay and Snowflake
给定一棵有根树,求出每一棵子树(有根树意义下且包含整颗树本身)的重心是哪一个节点。
解题思路
本题中子树无特殊说明指的是有根树意义下且包含整颗树本身的「向下」的子树。
根据第四条性质,对于一棵以点
类似于上文提到的 DFS 求重心方法,对于每棵以节点
时间复杂度为
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
参考
http://fanhq666.blog.163.com/blog/static/81943426201172472943638/(博客园转载,Internet Archive)
https://blog.csdn.net/weixin_43810158/article/details/88391828
https://www.cnblogs.com/zinthos/p/3899075.html
https://www.cnblogs.com/suxxsfe/p/13543253.html
《信息学奥林匹克辞典》2.4.7.11 章 1. 树的重心
习题
- POJ 1655 Balancing Art(模板题)
- 洛谷 P1364 医院设置
- Codeforces 1406C Link Cut Centroids
- Codeforces 708C Centroids
本页面最近更新:2023/11/25 19:17:37,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:CornWorld, H-J-Granger, Ir1d, ttzc, Anguei, BackSlashDelta, CCXXXI, ChungZH, Enter-tainer, Konano, ksyx, LucienShui, Marcythm, ouuan, StudyingFather, Tiphereth-A
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用