树的重心【模板】

白昼怎懂夜的黑 提交于 2020-02-25 18:11:19

知识点介绍

树的重心也就是树的质心,该点为根的有根树时,最大子树的节点数最小的根
碰到题目了再贴题

代码片

这边用链式前向星建图了

#include<bits/stdc++.h>
using namespace std;
/*
**树的重心:该点为根的有根树时,最大子树的节点数最小 
*/ 
const int N=10005;
struct edge{
	int to, next;
}e[N];
int head[N];
int cnt;
int n;
int num[N];		//num[i]表示第i个点其子树的节点数
int root, ans=1e9;		//记录根

void add(int x, int y) {
	cnt++;
	e[cnt].to=y;
	e[cnt].next=head[x];
	head[x]=cnt;
}

void find(int x, int fa) {		
	num[x]=1;		//记录x的子树结点个数,为了反向求结点,得算上自己
	int maxn=0;		//最大子树结点数 
	for(int i=head[x]; ~i; i=e[i].next) {
		int v=e[i].to;
		if ( v==fa ) continue;
		find(v,x);
		num[x]+=num[v];
		maxn=max(maxn,num[v]);
	}
	maxn=max(maxn,n-num[x]);		//父结点的比较
	if ( maxn<ans ) {
		ans=maxn;
		root=x;
	}
}

int main() {
	//freopen("in.txt","r",stdin);
	cin>>n;
	for(int i=1; i<=2*n; i++ ) head[i]=-1, e[i].next=-1;
	for(int i=1; i<n; i++ ) {
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	find(1,-1);
	printf("root = %d, num = %d", root, ans);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!