树的重心中心直径LCA

本文介绍了树的重心、中心的概念及其性质,指出树的中心一定位于直径上,最多存在两个。详细讲解了最近公共祖先(LCA)的四种求解方法,包括暴力求解、倍增算法等。同时,阐述了树的直径的定义和性质,提供了两种求解树的直径的方法,分别是暴力DFS和结合LCA的方法。
摘要由CSDN通过智能技术生成

树的重心

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值