• Network


    题目链接:Click here

    Solution:

    题目只要求覆盖叶子节点,那么我们先找到所有没被覆盖的叶子节点

    我们把叶子节点按照到服务端的距离从大到小排序,然后贪心的找到它向上第k个祖先即可(因为先覆盖较小的显然不会覆盖到较大的,而先覆盖较大的却有可能覆盖较小的)

    Solution:

    #include<iostream>
    #include<cstdio>
    #include<ctype.h>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int N=1e3+11;
    int n,rt,k,cnt,tot,ans;
    int head[N],fa[N],de[N],p[N],dep[N];
    struct Edge{int nxt,to;}edge[N<<1];
    inline bool cmp(int x,int y){return dep[x]>dep[y];}
    void ins(int x,int y){
        edge[++cnt].nxt=head[x];
        edge[cnt].to=y;head[x]=cnt;
    }
    void dfs(int x,int fat){
        for(int i=head[x];i;i=edge[i].nxt){
            int y=edge[i].to;
            if(y==fat) continue;
            dep[y]=dep[x]+1;
            fa[y]=x;dfs(y,x);
        }
    }
    void change(int x,int fat){
        if(dep[x]==k) return ;
        for(int i=head[x];i;i=edge[i].nxt){
            int y=edge[i].to;
            if(y==fat) continue;
            if(dep[y]>dep[x]+1)
                dep[y]=dep[x]+1,change(y,x);
        }
    }
    void solve(){
        for(int i=1;i<=n;i++)
            if(de[i]==1&&dep[i]>k) p[++tot]=i;
        sort(p+1,p+n+1,cmp);
        for(int i=1;i<=tot;i++)
            if(dep[p[i]]>k){
                int x=p[i],y=k;
                while(y--) x=fa[x];
                dep[x]=0;change(x,0);++ans;
            }
        printf("%d
    ",ans);
    }
    int read(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    signed main(){
        int t=read();
        while(t--){ans=tot=cnt=0;
            memset(head,0,sizeof(head));
            memset(dep,0,sizeof(dep));
            memset(de,0,sizeof(de));
            memset(fa,0,sizeof(fa));
            n=read(),rt=read(),k=read();
            for(int i=1;i<n;i++){
                int x=read(),y=read();
                ins(x,y),ins(y,x);
                de[x]++,de[y]++;
            }dfs(rt,0);solve();
        }return 0;
    }
    
  • 相关阅读:
    idea双击打不开没反应的解决办法
    Golang Learn Log #0
    获取请求header的各种方法
    Linux 指令
    Windows下Anaconda的安装和简单使用
    如何把Python脚本导出为exe程序
    C++星号的含义
    仓库盘点功能-ThinkPHP_学习随笔
    详解html中的元老级元素:“table”
    IE在开发工具启动的情况下(打开F12)时 JS才能执行
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11619869.html
Copyright © 2020-2023  润新知