知识点介绍
树的重心也就是树的质心,该点为根的有根树时,最大子树的节点数最小的根
碰到题目了再贴题
代码片
这边用链式前向星建图了
#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);
}
来源:CSDN
作者:zx1020354953
链接:https://blog.csdn.net/zx1020354953/article/details/104490422