#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 10,M = N * 2;
int e[M],h[N],ne[M],idx;
int ans = N;
bool st[N];
int n;
void add(int a,int b)
{
e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
}
int dfs(int u)
{
st[u] = true;
int res = 0,sum = 1;
for(int i = h[u];i != -1;i = ne[i])
{
int j = e[i];
if(!st[j])
{
int s = dfs(j);
res = max(s,res);
sum += s;
}
}
res = max(n - sum,res);
ans = min(res,ans);
return sum;
}
int main()
{
cin >> n;
memset(h,-1,sizeof h);
for(int i = 0;i < n - 1;i ++)
{
int a,b;
cin >> a >> b;
add(a,b),add(b,a);
}
dfs(1);
cout << ans << endl;
return 0;
}
总结:重心:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小。dfs(u)返回以u为根节点的树的节点数,res为最大连通块的节点数。