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