代码如下:
# include <bits/stdc++.h>
using namespace std;
const int N = 100010, M = 2*N;
int h[N], e[M], en[M], idx, n;//数组模拟单链表
bool st[N];
int ans = N;
void add(int a, int b)//添加a→b
{
e[idx] = b;
en[idx] = h[a];
h[a] = idx++;//也可以分两步来写
}
int dfs(int u)//以u为根的子树中 点的数量
{
st[u]=true;
int sum = 0, size = 0;
for(int i = h[u];i!=-1;i = en[i])
{
int j = e[i];
if(st[j]) continue;
int s = dfs(j);
size = max(size, s);//先比较其所有子树的
sum+=s;
}
size = max(size, n-sum-1);//再比较剩的
ans = min(size, ans);
return sum+1;
}
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;
}