树的重心
Posted hhyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的重心相关的知识,希望对你有一定的参考价值。
# 题意
树的重心定义:删除掉树中的某一个节点后,树被分成不相连的几个部分,每一个部分都是一颗子树,max_part(x)表示删除了x后产生的子树中最大的一棵的大小,其中max_part的最小值的点就是树的重心
# 题解
选子树的最大size,如果当前点不是根,那删除该点后,除了它和它的孩子,其余都在一个连通的树之中,所以还要进行这一步的判断
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10,M=2*N; 4 int h[N],ne[M],e[M],idx; 5 int n; 6 bool st[N]; 7 int sz[N]; 8 int ans=N; 9 int pos; 10 void add(int a,int b){ 11 e[idx]=b,ne[idx]=h[a],h[a]=idx++; 12 } 13 void dfs(int x){ 14 st[x]=1,sz[x]=1; 15 int max_part=0; 16 for(int i=h[x];i!=-1;i=ne[i]){ 17 int y=e[i]; 18 if(st[y]) continue; 19 dfs(y); 20 sz[x]+=sz[y]; 21 max_part=max(max_part,sz[y]); 22 } 23 max_part=max(max_part,n-sz[x]); 24 if(max_part<ans){ 25 ans=max_part; 26 pos=x; 27 } 28 } 29 int main(){ 30 memset(h,-1,sizeof h); 31 cin>>n; 32 for(int i=0;i<n;i++){ 33 int a,b; 34 cin>>a>>b; 35 add(a,b),add(b,a); 36 } 37 38 dfs(1); 39 cout<<ans<<endl; 40 }
以上是关于树的重心的主要内容,如果未能解决你的问题,请参考以下文章