dfs表示返回以u为根节点子树的点的个数(包括n),每次dfs下一层迭代一次删除u子树后的节点最大值,将这些最大值的最小值迭代成答案。
#include<iostream>
#include<cstring>
using namespace std;
const int N =100010;
int head[N],e[N],ne[N],idx;
bool view[N];
int ans=N,n;
void insert(int a,int b)
{
e[idx]=b,ne[idx]=head[a],head[a]=idx++;
}
int dfs(int u)
{
view[u]=true;
int size=0,sum=0;
for(int i=head[u];i!=-1;i=ne[i])
{
int j=e[i];
if(view[j])continue;//第一次遍历
int s =dfs(j);
size=max(size,s);
sum+=s;
}
size = max(size, n - sum - 1);
ans = min(ans, size);
return sum + 1;
}
int main()
{
cin>>n;
memset(head,-1,sizeof head);
for(int i=0;i<n-1;++i)
{
int a,b;
cin>>a>>b;
insert(a,b),insert(b,a);
}
dfs(1);
printf("%d",ans);
return 0;
}