#include<iostream>usingnamespace std;constint N =100010;constint M = N *2;int Head[N];int Next[M];int Value[M];bool IsVisit[N];int Index;int Ans = N;int n;voidAdd(int a,int b){
Value[Index]= b;
Next[Index]= Head[a];
Head[a]= Index;
Index++;}//返回以当前节点为根的 节点个数 intDfs(int Root){
IsVisit[Root]=true;//Sum就是当前节点为根的节点个数 包括它本身 //Res 是记录当前节点的每个子树节点个数的最大值 int Sum =1, Res =0;//for(int i = Head[Root]; i !=-1; i = Next[i]){int j = Value[i];//j是和根节点有边的节点 //如果没有被访问过 if(!IsVisit[j]){int s =Dfs(j);//S每次都是获取子树的节点数
Res =max(Res,s);
Sum += s;}}//删除当前节点以及其子树 剩下的节点个数
Res =max(Res,n-Sum);
Ans =min(Res,Ans);return Sum;}intmain(int argc,char** argv){fill(Head,Head+N,-1);
cin>>n;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;return0;}