BZOJ2097: [Usaco2010 Dec]Exercise 奶牛健美操 贪心+伪树dp+二分

//论全局变量的杀伤力....QAQ
#include<cstdio> #include<iostream> #include<cstdlib> #include<algorithm> #include<vector> #define MAXN 100005 using namespace std; int f[MAXN]; struct Tree { int to,next; }c[MAXN<<2]; vector<int>son[MAXN]; int head[MAXN],t; inline void add(int x,int y) { c[++t].to=y; c[t].next=head[x]; head[x]=t; c[++t].to=x; c[t].next=head[y]; head[y]=t; } int n,s,mid; int comp(const int x,const int y) { return f[x]>f[y]; } void Dfs(int p,int fa) { for(int i=head[p];i;i=c[i].next) if(c[i].to!=fa) { son[p].push_back(c[i].to); Dfs(c[i].to,p); } son[p].push_back(0); } void dfs(int p,int &x,int fa) { for(int i=head[p];i;i=c[i].next) if(c[i].to!=fa) dfs(c[i].to,x,p); sort(son[p].begin(),son[p].end(),comp); int i=0; for(;i<son[p].size()-1;i++) if(f[son[p][i]]+f[son[p][i+1]]>mid) x++; else break; f[p]=f[son[p][i]]+1; } int main() { scanf("%d%d",&n,&s); for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); } Dfs(1,0); int l=0,ans=n-1,r=n-1; while(l<=r) { mid=(l+r)>>1; int x=0; dfs(1,x,0); if(x<=s) ans=mid,r=mid-1; else l=mid+1; } printf("%d",ans); return 0; }

 

posted @ 2017-06-19 16:44  TS_Hugh  阅读(252)  评论(0编辑  收藏  举报