rt
30pts求调
#include<bits/stdc++.h>
const int N=3e5+5;
using namespace std;
int f[N];
int cnt=0,head[N*2];
struct Node{
int v;int next;
}e[N*2];
inline void addedge(int u,int v){
e[++cnt].v=v;e[cnt].next=head[u];head[u]=cnt;
}
void dp(int now,int father,int k)
{
int ie=0;
for(int i=head[now];i;i=e[i].next)
if(e[i].v!=father)
{
int next=e[i].v;
dp(next,now,k);
f[i]+=f[next];
ie++;
}
f[now]=max(0,f[now]+ie-k);
}
int n;
int main()
{
cin>>n;
if(n==1){cout<<"0"<<endl;return 0;}
for(int i=1,u,v;i<=n-1;++i)
{
cin>>u>>v;
addedge(u,v);addedge(v,u);
}
int l=1,r=n-1,ans=0;
while (l<r)
{
int mid=(l+r)>>1;
memset(f,0,sizeof(f));
dp(1,0,mid);
if (f[1]==0)
r=mid;
else l=mid+1;
}
cout<<l<<endl;
return 0;
}