1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include<vector> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; void Rd(int&res){ res=0;char c; while(c=getchar(),c<48); do res=res*10+(c&15); while(c=getchar(),c>47); } const int N=300005; int head[N],tot_edge; struct Edge{ int to,nxt; }edge[N<<1]; void add_edge(int a,int b){ edge[tot_edge]=(Edge){b,head[a]}; head[a]=tot_edge++; } int n,cnt[N],fa[N]; ll sum[N]; vector<int>num[N]; void dfs(int p,int f,int d){ num[d].push_back(p); fa[p]=f; for(int i=head[p];~i;i=edge[i].nxt){ int to=edge[i].to; if(to!=f)dfs(to,p,d+1); } } bool judge(int mid){ if(mid<cnt[1])return false; memset(sum,0,sizeof(sum)); sum[1]=mid-cnt[1]; for(int d=1;d<=n;d++){ for(int i=0;i<num[d].size();i++){ int p=num[d][i]; int par=fa[p]; sum[p]=mid-cnt[p]+1; } } for(int d=n;d>=1;d--){ for(int i=0;i<num[d].size();i++){ int p=num[d][i]; int par=fa[p]; if(sum[p]<0){ sum[par]+=sum[p]; } } } if(sum[1]<0)return false; return true; } int main(){ memset(head,-1,sizeof(head)); Rd(n); for(int i=1,a,b;i<n;i++){ Rd(a),Rd(b); add_edge(a,b); add_edge(b,a); cnt[a]++,cnt[b]++; } dfs(1,0,0); int L=0,R=n,res=-1; while(L<=R){ int mid=L+R>>1; if(judge(mid)){ res=mid; R=mid-1; }else L=mid+1; } printf("%d\n",res); return 0; }
|