zoukankan      html  css  js  c++  java
  • HZAU 2196 多源最短路

    题意

    给个长度为k的只包含01的字符串,定义2个不同的串之间的距离是他们相等的位的数量,比如1010和0101的距离为0;1100和1110的距离为3。现要求我们构造出一个全新的串使得它与所有给定的01串之间的距离的最大值最小,输出这个最小的距离.(数据保证一定能构造出一个全新的01字符串。)    n,k表示字符串的个数和串的长度。(1<=n<=10^5,1<=k<=20)

    分析

    要求最大zhuan最小,可以转化为求所有最小的最大,将已知的n个点当做起点,跑多源最短路即可,answer即为n-max(d[i])

    #include <cstdio>
    #include <iostream>
    #include <queue>
    using namespace std;
    int d[1<<20],vis[1<<20];
    int up=0,k,n;
    int solve(){
        queue<int> q;
        for(int i=0;i<up;i++){
            vis[i]=0;
            if(d[i]==0){
                vis[i]=1;
                q.push(i);
            }
        }
        while(q.size()){
            int x=q.front();
            q.pop();
            for(int i=0;i<k;i++){
                int y=x^(1<<i);
                if(!vis[y]){
                    d[y]=d[x]+1;
                    vis[y]=1;
                    q.push(y);
                }
            }
        }
        int res=0;
        for(int i=0;i<up;i++)res=max(res,d[i]);
        return k-res;
    }
    int main(){
        int t;
        scanf("%d",&t);
        while(t--){
            scanf("%d %d",&n,&k);
            up=1<<k;
            char c[30];
            for(int i=0;i<up;i++)d[i]=1e9;
            for(int i=1;i<=n;i++){
                scanf("%s",c);
                int tmp=0;
                for(int i=k-1;i>=0;i--){
                    tmp=tmp*2+c[i]-'0';
                }
                d[tmp]=0;
            }
            cout<<solve()<<endl;
        }
        return 0;
    }
  • 相关阅读:
    VSCode:无法创建临时目录
    网页很卡的原因
    用css做三角形
    移动端加载页面出现抖动、未加载完成时布局杂乱问题解决
    vue中使用axios进行ajax请求数据(跨域配置)
    fetch和XMLHttpRequest
    1-5-JS基础-数组应用及实例应用
    图片左右切换
    轮播图片切换
    轮播图片切换(函数合并)
  • 原文地址:https://www.cnblogs.com/Deadline/p/9006242.html
Copyright © 2011-2022 走看看