树的重心
也有许多的信息是自底向上进行统计的,比如每个节点x为根的子树大小
对于一个节点x,如果我们把它从树中删除,那么原来的一棵树可能会分成若干个不相连的部分,其中每一部分都是子树,设maxpart函数表示在删除节点x后产生的子树中,最大的一颗的大小,那么x就是重心
void dfs(int x)
{
v[x]=1;
size[x]=1;//假设子树的大小
int maxpart=0;//假设,预处理
for(int i=head[x];i;i=next[i])
{
int y=edge[i].ver;
if(v[y]) continue;
dfs(y);
size[x]+=size[y];
maxpart=max(maxpart,size[y]);//获取最大的子树
}
maxpart=max(maxpart,n-size[x]);//删除这个点最大值
if(maxpart<ans)//这里为什么记录小一点的?
//
{
ans=maxpart;//记录对应长度
pos=x;//记录重点
}
}
树的中心
圆的中心是圆心,树的中心呢?
树的中心类似与圆心,是该点到树中其他点的距离最远距离最小,同样,树的中心可能有很多个
树的中心满足如下性质:
1.它一定在树的直径上,并且到直径两端距离差不超过1
2.即使树有很多条直径,但是树的中心最多只有两个
假设直径长度为R,我们在x~y的路径上找到与x距离R/2的点,如果R/2小于x到z的路径,那么中心就在x到z的路径上,否则就在z到y的路径上 ,类似于二分思想
int work()
{
int R=de[x]+de[y]-2*de[z];
if(de[x]-de[z]>R/2)
{
for(int i=1;i&