重心

暑假集训 2019.08.01 chemistry

社会主义新天地 提交于 2019-11-25 23:53:59
题意: 给一棵 $n$ 个点的树 , 有$m$次询问. 每次询问给出$x$, 求一个最小的$k$使得把树上$k$条边断掉然后重新连$k$条边形成一棵新的树之后, 树的重心为$x$. $ $ 树的重心:对于一棵无根树上的每个节点 , 将其变成根之后 , 最大子树大小最小的节点便是重心 . $ $ 题解: 首先要知道重心的一个基本性质:若$x$是重心 , 那么以$x$为根的每棵子树的$size$都小于等于$\frac{n}{2}$( 挺显然的? . 我们对于根节点 , 考虑最少删掉根节点的几棵子树 , 使得根节点剩余的$size$小于等于$\frac{n}{2}$ . 若按照子树大小排序后删去前$k$大棵子树之后满足$size$小于等于$\frac{n}{2}$ , 对于还在根节点联通块内的每个节点 , 要求的次数等于$k$或$k-1$ . 将某个节点变成根之后 , 其最大子树的$size$肯定是其之前所处的联通块内节点数减去它之前的所有子树的$size$ , 所以我们要用算出联通块中节点数量 . 又因为联通块中节点数量必定满足小于等于$\frac{n}{2}$ , 所以就是断掉$k$条边即可 ; 因为我们还要用联通块中节点数量减去它的其他子树 , 所以可能只用删$k-1$棵子树就满足联通块中节点数量减去它的其他子树后小于等于$\frac{n}{2}$ , 于是乎答案就为$k$或$k