AcWing 846. 树的重心
原题链接
简单
作者:
minux
,
2020-04-26 09:30:55
,
所有人可见
,
阅读 562
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=2*N;
int n;
int h[N], e[M], ne[M], idx;
bool vis[N];
int ans=N; // 存储最小最大值
// 插入节点, 在x节点之后插入y节点, 使得x-y形成无向边
void ins(int x, int y){
e[idx]=y;
ne[idx]=h[x];
h[x]=idx++;
}
// 以root为根节点的子树中点的数量
int dfs(int root){
vis[root]=true;
int sum=1; // 当前子树的连通块size
int res=0; // 删除该点后, 连通块点数的最大值
for(int i=h[root]; i!=-1; i=ne[i]){
int j=e[i];
if(!vis[j]){
int s =dfs(j);
res =max(res, s);
sum+=s;
}
}
res=max(res, n-sum); // 计算删除节点的非子节点部分
ans=min(ans, res);
return sum;
}
int main(){
cin>>n;
memset(h, -1, sizeof h);
memset(vis, 0x00, sizeof vis);
for(int i=0; i<n-1; ++i){
int x, y;
cin>>x>>y;
ins(x, y);
ins(y, x);
}
dfs(1);
cout<<ans<<endl;
return 0;
}