码迷,mamicode.com
首页 > 其他好文 > 详细

树的重心

时间:2020-03-03 00:42:41      阅读:47      评论:0      收藏:0      [点我收藏+]

标签:bsp   树的重心   const   col   code   ems   大小   tin   mem   

# 题意

树的重心定义:删除掉树中的某一个节点后,树被分成不相连的几个部分,每一个部分都是一颗子树,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 }

 

树的重心

标签:bsp   树的重心   const   col   code   ems   大小   tin   mem   

原文地址:https://www.cnblogs.com/hhyx/p/12399135.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!