题解【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

posted @ 2021-07-05 18:39  bear_xin  阅读(22)  评论(0)    收藏  举报