树的重心中心直径LCA

树的重心

也有许多的信息是自底向上进行统计的,比如每个节点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&

你可能感兴趣的:(LCA)