您的位置:首页 > 理论基础 > 数据结构算法

求树的重心

2016-07-14 21:42 323 查看

大致内容

树的重心定义:已该点为根,则它的所有子树的最大节点最小。

求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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构