https://www.luogu.com.cn/blog/Five-shifts-Forever/shu-di-zhong-xin
性质
1.树中所有点到某个点的距离和中,到重心的距离和是最小的(边长为1的情况下)。
2.将树删除某点进行分割后,得到若干子树,最大子树包含的节点数为x,删除重心的方案得到x会最小。
求解方法
遍历所有节点,求出删除该节点后的最大连通块,每次取最优即可。
int n,ans=1e9,d[50005],maxn=1e9;//节点数 重心位置 子节点数目 当前最优的子节点数目
vector <int>g[50005];
void dfs(int cur,int fa)
{
d[cur]=1;
int res=0;
for(int i=0; i<g[cur].size(); i++)
{
int x=g[cur][i];
if(x==fa)
continue;
dfs(x,cur);
d[cur]+=d[x];
res=max(res,d[x]);//求出子树中包含的最多节点数
}
res=max(res,n-d[cur]);//求出父亲方向的节点数
if(res<maxn)
{
maxn=res;
ans=cur;
}
}
例题 https://www.luogu.com.cn/problem/P1395