题意:求树上任何一个点是否能在切去一条边连上一条边后成为新树的重心(即以其为根的子树size≤n/2)
题解:
对于某个点,如果初始情况下已经是重心,则必然可以,且修改后也必然可以。
若初始时不是重心,则必然有且仅有一颗子树的size≥n/2。
那么问题转化成对于每个点作为根的时候,他的所有子树减去一个最大的≤n/2的子树的子树后是否可以做到新的size小于n/2。
dp[now]表示以一为整棵树的根节点的时候now的子树上的最大的≤n/2的大小。
dp2[now]表示以now为根节点的时候now的父节点的子树上最大的siz≤n/2的子树大小。使用换根dp:
然后对于每一个点 判断所有相邻的son十分满足siz[son]-dp[son]≤n/2 以及 n-siz[now]-dp2[now]≤n/2是否满足即可。
注意:这里直接枚举fa点的所有相连接的点会TLE,因为可能有多个点的fa都是同一个,这样菊花图可以卡成n^2,所以要在转移dp[i]的时候维护最大值的点下标,由于有可能最大值就出现在now点,此时不能选最大值,还要维护一个次大值。
原文:https://www.cnblogs.com/14long-Alex/p/14797530.html