大致内容
树的重心定义:已该点为根,则它的所有子树的最大节点最小。
求x点的子树的最大节点就是求出每一个子节点的儿子的个数(包括它本身)size[x]取最大值。
然后,还要与(整棵树大小-此节点的儿子的个数(包括它本身))作比较,你可以将剩下的其他点全部看成在一棵子树里面。
伪代码
求出节点x的所有子节点的size,mx[x]=max(mx[x],size[v(x的儿子)],
mx[x]=max(mx[x],整棵树大小-size[x])
如果mx[x]<mx[树的重心]说明x是树的重心。
Code
void zheavy(int set,int x,int y)
{
int i;
mx[x]=0;size[x]=1;
for (i=head[x];i;i=next[i])
{
if (go[i]!=y)
{
zheavy(set,go[i],x);
size[x]+=size[go[i]];
mx[x]=max(mx[x],size[go[i]]);
}
}
mx[x]=max(mx[x],set-size[x]);
if (mx[x]<mx[hv]) hv=x;
return;
}