【题解】P2726 [SHOI2005]树的双中心 树的(带权)重心、树形dp

题目链接

树的重心的一些性质:

  • 对于边权非负的树,树上所有的点到树的重心的距离之和是最短的,如果有多个重心,那么总距离相等。

  • 插入或删除一个点,树的重心的位置最多移动一个单位。

  • 若添加一条边连接 \(2\) 棵树,那么新树的重心一定在原来两棵树的重心的路径上。

  • 一棵树如果有两个重心,这两个重心一定是相邻的。

  • 一棵树的重心一定在根节点所在的重链上。

  • 一棵树的重心一定是以该树根节点重儿子为根的子树的重心的祖先。

对于重心的存在性证明与第一条性质的证明直接考虑调整即可(对于第一条性质考虑调整到和重心相邻的点上,对于树的重心存在性可以考虑往最大的子树上走。)

回到本题,对于一对点 \((x,y)\) 考虑有哪些点最短路是到 \(x\) 最短的,哪些是到 \(y\) 最短的,考虑树上路径 \(x\to y\) 上的每个点以及其伸出的每棵子树,发现一定是可以划分成两个连通块的。

那么暴力做法即每次枚举断边分别求断出的两个子树的带权重心。

根据一棵树的重心一定在根节点所在的重链上(可以用 \(f[u]\) 表示 \(u\) 子树内所有点到 \(u\) 的距离的和,考虑 \(u\) 的一个子节点 \(v\) ,子树内所有点到 \(v\) 的距离和比 \(f[u]\) 小要满足的条件证明),我们可以维护每个点的重儿子和次重儿子,每次断边子树内 \(O(h)\) 地更新子树补的 \(sz\) ,再 \(O(h)\) 地遍历重链即可。

代码记录

posted @ 2021-09-25 00:10  Themaxmaxmax  阅读(285)  评论(0编辑  收藏  举报