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;
}

浙公网安备 33010602011771号