• 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;
    }
  • 相关阅读:
    Linux的命令、用户、权限管理
    Java中快捷键
    数组的学习
    Java中方法定义和调用的学习
    java中的标识符、修饰符、关键字
    MYSQL的学习
    JavaScript小白教程2
    navicat中选择utf-8时的困惑
    python小白教程
    英语单词
  • 原文地址:https://www.cnblogs.com/Deadline/p/9006242.html
Copyright © 2020-2023  润新知