二分枚举答案后,做一个可行性dp来检验。
#include <bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,u,v,l,r,mid,ans;
int f[N];
int cnt,head[N];
struct edge{int next,to;}e[N<<1];
inline void add(int u,int v)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dfs(int u,int fa)
{
int sum=0;
for (register int i=head[u]; i; i=e[i].next)
if (e[i].to!=fa)
{
dfs(e[i].to,u);
sum+=f[e[i].to]+1;
}
f[u]=max(0,sum-mid);
}
inline bool jay()
{
memset(f,0,sizeof(f));
dfs(1,0);
if (!f[1]) return true;
else return false;
}
int main(){
scanf("%d",&n);
for (register int i=1; i<n; ++i) scanf("%d%d",&u,&v),add(u,v),add(v,u);
l=0; r=n; ans=n;
while (l<=r)
{
mid=l+r>>1;
if (jay()) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}