二分答案
第二个人不会走回头路
那么F[i]表示在i的子树内(不包括i)所需要的额外步数
F[1]==0表示mid可行
k可能为0
#include<cstdio>
#include<algorithm>
using namespace std;
int cnt,n,mid,F[300005],last[300005];
struct node{int to,next;
}e[600005];
void add(int a,int b){e[++cnt].to=b;e[cnt].next=last[a];last[a]=cnt;
}
void dfs(int x,int fa){F[x]=0;for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (V==fa) continue;dfs(V,x);F[x]+=F[V]+1; }F[x]=max(F[x]-mid,0);
}
int main(){scanf("%d",&n);for (int i=1; i<n; i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}int l=0,r=n;while (l<r){mid=(l+r)>>1;dfs(1,0);if (!F[1]) r=mid;else l=mid+1;}printf("%d\n",l);return 0;
}