复杂度O(nlog^2n)
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<iostream> #define maxn 100010 #define maxm 200010 using namespace std; int head[maxn],to[maxm],next[maxm],g[maxn]; int f[maxn],a[maxn]; int n,m,num,s,ans,cnt; void addedge(int x,int y) { num++;to[num]=y;next[num]=head[x];head[x]=num; } void dfs(int x,int fa,int num) { f[x]=0; for (int p=head[x];p;p=next[p]) if (to[p]!=fa) dfs(to[p],x,num); cnt=0;a[0]=0; for (int p=head[x];p;p=next[p]) if (to[p]!=fa) a[++cnt]=f[to[p]]+1; sort(a+1,a+cnt+1); while (cnt && a[cnt]+a[cnt-1]>num) cnt--,ans++; f[x]=a[cnt]; } bool check(int x) { ans=0; dfs(1,0,x); if (ans<=s) return 1; else return 0; } int main() { scanf("%d%d",&n,&s); for (int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); addedge(x,y);addedge(y,x); } int l=1,r=n,ans=n; while (l<=r) { int mid=(l+r)/2; if (check(mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans); return 0; }