树的重心

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 }

 

以上是关于树的重心的主要内容,如果未能解决你的问题,请参考以下文章

HDU6567树的重心换根DP

树的重心及直径

求树的重心

『Balancing Act 树的重心』

树的重心

树的重心