EZOJ #389点分治好题

分析

一层一层把叶子去掉

看最多能去掉多少层即可

代码

#include<bits/stdc++.h>
using namespace std;
int vis[2000100],du[2000100],fa[2000100],n,m,ans;
int head[2000100],to[4000100],nxt[4000100],cnt; 
int q[2000100],le,ri;
inline int ra(){
    int x=0;char s=getchar();
    while(!isdigit(s))s=getchar();
    while(isdigit(s))x=(x<<3)+(x<<1)+(s-'0'),s=getchar();
    return x;
}
inline void add(int x,int y){
    nxt[++cnt]=head[x];
    head[x]=cnt;
    to[cnt]=y;
    nxt[++cnt]=head[y];
    head[y]=cnt;
    to[cnt]=x;
}
inline void dfs(int x,int f){
    fa[x]=f;
    for(int i=head[x];i;i=nxt[i])
      if(to[i]!=f)dfs(to[i],x);
}
int main(){
    int i,j,k;
    n=ra(),k=ra();
    k=n-k;
    for(i=1;i<n;++i){
      int x,y;
      x=ra(),y=ra();
      du[x]++,du[y]++;
      add(x,y);
    }
    dfs(1,0);
    le=1;
    for(i=1;i<=n;++i)if(du[i]==1)q[++ri]=i,vis[i]=1;
    while(ri>=le){
      int x=q[le];
      le++;
      k--;
      ans=max(ans,vis[x]);
      if(!k)break;
      for(i=head[x];i;i=nxt[i]){
          if(du[to[i]]<=1)continue;
          du[to[i]]--;
          vis[to[i]]=max(vis[to[i]],vis[x]+1);
          if(du[to[i]]==1)q[++ri]=to[i];
      }
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/yzxverygood/p/11611729.html