zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Linux--VSFTP服务搭建
    Linux--Smba服务搭建
    Linux--DHCP搭建
    编程语言的分类
    用户,组及权限
    linux常用基本命令整理小结
    数据结构之顺序表实现
    进程管理之system
    进程管理之wait和waitpid
    进程管理之fork函数
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/11611729.html
Copyright © 2011-2022 走看看