AcWing 846. 树的重心
原题链接
简单
作者:
369pro
,
2024-09-10 20:28:00
,
所有人可见
,
阅读 7
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100005, M = N*2;
// h[i]: 第i个节点的 第一条[出边的idx]
// e[idx]: 第idx条 [边的终点]
// ne[idx]: 与第idx条边同起点的下一条边的idx
int h[N], e[M], ne[M], idx;
int res = 0x3f3f3f3f, n;
bool visited[N];
void add(int a, int b){
e[idx] = b; // 此处要注意!!!
ne[idx] = h[a];
h[a] = idx++;
}
int dfs(int u){
visited[u] = true;
// u及其u的所有子树节点数目
// 解释:这种存储方式 叶子节点只与其父节点有连接关系,与其子节点无连接关系
// 遍历到叶子结点时,直接跳过for-loop return 1
int sum = 1;
// u的子树的最大节点数
int size = 0;
// 遍历边
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
if(visited[j]) continue;
int s = dfs(j);
sum += s;
size = max(size, s);
}
res = min(res, max(size, n-sum));
return sum;
}
int main(){
memset(h, -1, sizeof h);
cin >> n;
// n-1条边
for(int i = 1; i < n; i++){
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
dfs(1);
cout << res << endl;
}