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;
}
原文地址:https://www.cnblogs.com/Deadline/p/9006242.html