题解【CF708C Centroids】
P1 题目描述
给出一棵树,你可以选择断掉其中的一条边将其重新连接到任意一个节点上,使其形成一棵新树,请问有哪些节点可以通过这种操作成为树的重心?
P2 新学知识
P3 用到的模板
DP二次扫描换根法
P4 题目思路
1.如果一个节点不是重心,就表示这个节点有一个子树的大小超出了 ⌊N/2⌋(而且只有一个),我们只需要在这个超出了 ⌊N2⌋ 的子树中挑选一个更小子树断掉他然后连到当前节点上来。
2.而且这是一棵无根树,形态确定不了,现在所叙述的 “子树” 可能是其父亲节点,一切都似乎变得很麻烦....
但是现在如果我们事先就先找到一个重心作为根
3.
对于根节点 ,无需讨论,他要剪去的就是他的最大子树;对于v,他的父亲u是root,要剪去的最大树枝是 max(n-son[v],maxson[u]/secondMaxSon[u](当他正在访问最大儿子的时候 ));当他的父亲 u谁都不是的时候,要减去的树枝是max(n-son[v],maxSon[u]/secondMaxSon[u],f[u ])
P5 代码解析
P6 奇怪的感悟们
over