#include using namespace std; using ll=long long; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin>>n; vector> graph(n); for(int i=1;i>u>>v; u--;v--; graph[u].push_back(v); graph[v].push_back(u); } if(n<=3){ cout<<1<>> dp(n); int inf=1e9; { auto dfs=[&](auto dfs,int v,int par)->array{ dp[v].resize(graph[v].size(),{inf,inf}); int sum=0; vector vec; for(int i=0;i res={inf,inf}; { int t=1; for(int x:vec)t+=x; res[0]=min(res[0],sum+t); res[1]=min(res[1],sum+t); } { int m=(graph[v].size()+2)/2; if(vec.size()>=m){ int t=0; for(int i=0;i=m){ int t=0; for(int i=0;i val)->void{ if(par!=-1){ for(int i=0;i s1,s2; int m=graph[v].size()/2; vector vec(graph[v].size()); for(int i=0;i arr={1+sum2-dp[v][i][1],1+sum2-dp[v][i][1]}; if(m+2<=graph[v].size()){ if(s2.count(dp[v][i][1]-dp[v][i][0])){ arr[0]=min(arr[0],sum2-(t2-(dp[v][i][1]-dp[v][i][0])+u2)); }else{ arr[0]=min(arr[0],sum2-t2); } } if(m+1<=graph[v].size()){ if(s1.count(dp[v][i][1]-dp[v][i][0])){ arr[1]=min(arr[1],sum2-(t1-(dp[v][i][1]-dp[v][i][0])+u1)); }else{ arr[1]=min(arr[1],sum2-t1); } } dfs(dfs,u,v,arr); } }; dfs(dfs,0,-1,{inf,inf}); } int ans=inf; for(int i=0;i vec; int sum=0; for(auto[x,y]:dp[i]){ sum+=x; vec.push_back(y-x); } ranges::sort(vec); for(int i=0;i