• GYM 101964 C(二分答案)


    传送门:

    题意:

        给你一个n个结点的树,其中有一部分结点是黑色的。现在让你选取m个黑色结点,使得这些黑色结点所形成的集合的中,任意两点间的最远距离最小。让你求出这个最远距离。

    题目分析:

        首先,题目中的”使得最大值最小“这句话就非常符合二分的条件了。因此我们考虑对答案(两个黑点的最远的距离)进行二分。

        现在就要考虑如何进行check。

        对于每一个二分值k,我们考虑先用bfs遍历整颗树,然后利用bfs的性质(距离当前点的所有已bfs过且小于等于d的那些点,他们之间两两距离也小于等于k),找出满足距离等于k的对应的一个个点集。之后我们可以用dfs去遍历这些点集,判断点集中的黑点的个数与需要选取的黑点个数m之间的关系即可(如果数量>=n,则右指针左移动;反之左指针右移)。

    代码:

    #include <bits/stdc++.h>
    #define maxn 105
    using namespace std;
    vector<int>vec[maxn];
    int vis[maxn];//用vis数组去区分点的不同的集合
    int a[maxn];
    queue<int>que;
    int n,m;
    int ans=0;
    int dfs(int now,int fa,int all,int dis){
        int res=a[now];
        if(dis==all) return res;
        for(auto &it:vec[now]){
            if(!vis[it]||it==fa) continue;
            res+=dfs(it,now,all,dis+1);
        }
        return res;
    }
    bool check(int k){//二分的check,本质上为一个bfs
        memset(vis,0,sizeof(vis));
        while(!que.empty()) que.pop();
        que.push(1);
        while(!que.empty()){//bfs选取部分点集
            int now=que.front();
            que.pop();
            vis[now]=1;
            int tmp=dfs(now,0,k,0);//通过dfs获取这个集合的黑点的个数
            if(tmp>=m) return 1;
            for(auto &it:vec[now]){
                if(vis[it]) continue;
                que.push(it);
            }
        }
        return 0;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        for(int i=0;i<n-1;i++){
            int from,to;
            scanf("%d%d",&from,&to);
            vec[from].push_back(to);
            vec[to].push_back(from);
        }
        int l=0,r=n;
        while(l<r){
            int mid=(l+r)>>1;
            if(check(mid)) r=mid;
            else l=mid+1;
            //cout<<l<<" "<<r<<endl;
        }
        cout<<r<<endl;
    }
    
  • 相关阅读:
    Linux平台下快速搭建FTP服务器
    CentOS7添加/删除用户和用户组
    Centos7上安装Nginx两种方法
    Centos7 yum安装tomcat
    Centos7下查看端口占用
    Centos7开放及查看端口
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    连接mysql数据库时提示2003 can't connect to MySQL server on ip(10060)的解决办法
    CentOS7 在线安装jdk8
    MySQL全方位练习(学生表 教师表 课程表 分数表)
  • 原文地址:https://www.cnblogs.com/Chen-Jr/p/11007175.html
Copyright © 2020-2023  润新知