树的重心板子

树的重心:删除这样的一个点以及其对应的边,能使得最大连通块节点个数最少

树的重心的性质:
1、树上所有的点到树的重心的距离之和是最短的,如果有多个重心,那么总距离相等。

2、插入或删除一个点,树的重心的位置最多移动一个单位。

3、若添加一条边连接2棵树,那么新树的重心一定在原来两棵树的重心的路径上。

int vis[maxn];
int ans=inf;
vector<int>e[maxn];
int dfs(int u){
	vis[u]=1;
	int size=0,sum=1;
	//size代表u为根的子树节点个数的最大值
	//sum代表以u为根的子树节点个数之和 
	for(int v:e[u]){
		if(vis[v])continue;
		int s=dfs(v);
		size=max(size,s);
		sum+=s;
	}
	ans=min(ans,max(size,n-sum));//最大子树节点数 与 u节点上方节点数比较 
	return sum;
}
posted @ 2025-03-31 21:19  Marinaco  阅读(20)  评论(0)    收藏  举报
//雪花飘落效果