POJ2724:Purifying Machine——题解
http://poj.org/problem?id=2724
描述
迈克是奶酪工厂的老板。他有2^N个奶酪,每个奶酪都有一个00 ... 0到11 ... 1的二进制数。为了防止他的奶酪免受病毒侵袭,他用一台净化机器来清理感染病毒的奶酪。净化机有N个开关,每个开关有三个状态,1,0和*。一次操作中,最多可用*一次,它可以代替1或0.当机器转到一个特定的状态时,操作将清除所有相应的二进制数字的奶酪。
有一天,迈克的机器被感染了。当麦克发现时,他已经做了一些操作,这台受感染机器操作的奶酪也被感染了。他尽可能快地清洗机器,现在他需要用最少的操作次数来清理被感染的奶酪。如果奶酪被感染,用机器清洗这个奶酪一次或多次将使这种奶酪再次免于病毒;但是如果一个奶酪没有被感染,这个奶酪的操作会使它变坏。
现在已知Mike已经完成的感染操作,你需要找出清理所有受感染的奶酪所需执行的最少操作次数。
输入
有几个测试用例。每个测试用例都包含两个数字N和M(1 <= N <= 10,1 <= M <= 1000)的行开始。以下M行中的每一行都包含机器的开关状态。 N = M = 0的测试用例结束输入,不应该被处理。
输出
对于每个测试用例,输出一行包含一个整数,这是Mike需要做的最小操作数。
示例输入
3 3
* 01
100
011
0 0
示例输出
2
————————————————————
因为题面很麻烦所以谷歌+手动翻译了一下。
首先将原串展开判重离散化,然后二分图最小边覆盖即可。
注意边是双向边所以用一种简单的方法解决最小边覆盖。
我们不拆点,而是连两条边(例如i到j有一条边,则A集合i连B集合j且B集合i连A集合j)
最后匹配数/2即可。
#include<cstdio>
#include<cstring>
#include<cctype>
#include<iostream>
#include<map>
using namespace std;
const int maxn=;
map<int,bool>mp;
int t[maxn],cnt=,m,n;
bool vis[maxn],a[maxn][maxn]={};
int shu[maxn]={};
char s[];
bool dfs(int i){
for(int j=;j<=cnt;j++){
if(a[i][j]&&!vis[j]){
vis[j]=;
if(!shu[j]||dfs(shu[j])){
shu[j]=i;
return ;
}
}
}
return ;
}
void read(){
cin>>s;
int sum=;
for(int i=;i<n;i++){
if(s[i]=='*')sum=sum*+;
else sum=sum*+s[i]-'';
}
if(!mp[sum]){
cnt++;mp[sum]=;t[cnt]=sum;
}
sum=;
for(int i=;i<n;i++){
if(s[i]=='*')sum=sum*+;
else sum=sum*+s[i]-'';
}
if(!mp[sum]){
cnt++;mp[sum]=;t[cnt]=sum;
}
return;
}
int main(){
while(cin>>n>>m){
if(n==&&m==)break;
memset(a,,sizeof(a));
mp.clear();cnt=;
for(int i=;i<=m;i++)read();
for(int i=;i<=cnt;i++){
for(int j=i+;j<=cnt;j++){
int k=t[i]^t[j];
if(k&&(k&(k-))==)a[i][j]=a[j][i]=;
}
}
int ans=;
memset(shu,,sizeof(shu));
for(int i=;i<=cnt;i++){
memset(vis,,sizeof(vis));
if(dfs(i))ans++;
}
printf("%d\n",cnt-ans/);
}
return ;
}
POJ2724:Purifying Machine——题解的更多相关文章
- POJ2724 Purifying Machine
嘟嘟嘟 扒下来的题意:迈克有一台可以净化奶酪的机器,用二进制表示净化的奶酪的编号.但是,在某些二进制串中可能包含有\(*\).例如\(01*100\),\(*\)其实就代表可以取\(0\),\(1\) ...
- POJ 2724 Purifying Machine(最大独立集)
POJ 2724 Purifying Machine 题目链接 题意:这题题意有点没看懂.看了别人的题解, 给出m串长度为n的01串. 有些串中可能包括,这种串能够表示两个串,为1 和为0. 反复的算 ...
- poj 2724 Purifying Machine
Purifying Machine Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5408 Accepted: 1575 ...
- 【poj2724】 Purifying Machine
http://poj.org/problem?id=2724 (题目链接) 题意 Mike有一个机器可以帮助他清理奶酪,每个奶酪由一个n位二进制数表示,机器上一共有n个按钮,每个按钮有1,0,*,其中 ...
- POJ 2724 Purifying Machine (二分图匹配)
题意 给定m个长度为n的01串(*既表示0 or 1.如*01表示001和101).现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个:②如果有两个串仅有一个字符不同,则可以同时删除这两个 ...
- UVA 1663 Purifying Machine (二分图匹配,最大流)
题意: 给m个长度为n的模板串,模板串由0和1和*三种组成,且每串至多1个*,代表可0可1.模板串至多匹配2个串,即*号改成0和1,如果没有*号则只能匹配自己.问:模板串可以缩减为几个,同样可以匹配原 ...
- UVA-1663 Purifying Machine (最大匹配数)
题目大意:每一个01串中最多含有一个‘*’,‘*’既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串.如:000.010.0*1表示000.010.001.011, ...
- UVa 1663 Purifying Machine (二分匹配)
题意:每一个01串中最多含有一个‘*’,‘*’既可表示0也可表示1,给出一些等长的这样的01串,问最少能用多少个这样的串表示出这些串. 如:000.010.0*1表示000.010.001.011,最 ...
- UVA1663 Purifying Machine (匈牙利算法,二分图最大匹配)
模版集合个数减少是因为匹配串集合中没被匹配过的一对串匹配了.所以就是找一个二分图最大匹配. 因为集合X和Y是不好分开的,但是可以直接跑,两个集合都会跑一遍,所以一个匹配会被算两次,返回的时候除以2就行 ...
随机推荐
- 鸡啄米:C++编程之十四学习之构造函数和析构函数
1. 本人学习鸡啄米课程的笔记记录,用来记录学习的历程和进度 2. 构造函数 我们在声明一个变量时,如果对它进行了初始化,那么在为此变量分配内存空间时还会向内存单元中写入变量的初始化.声明对象有相似的 ...
- 追书神器API
由于自己喜欢看小说,有的时候不方便手机看的时候希望在电脑上面看,但很多网站有广告啊,于是封装了套手机版的追书神器API 目前只做了搜索 详情 书评 换源 正文 调用方式: //搜索小说 var sea ...
- PLSQL-包函数存储过程
包: 包是PLSQL中多个单元的逻辑组合,他将过程组合在一个包内容,以供用户调用,使用后,不需要程序员频繁的修改程序,可以保持程序的逻辑完整性,对包中的过程重新定义或者编译,以便修改部分功能,从而更好 ...
- 「日常训练」Kefa and Company(Codeforces Round #321 Div. 2 B)
题意与分析(CodeForces 580B) \(n\)个人,告诉你\(n\)个人的工资,每个人还有一个权值.现在从这n个人中选出m个人,使得他们的权值之和最大,但是对于选中的人而言,其他被选中的人的 ...
- 第5章 Linux网络编程基础
第5章 Linux网络编程基础 5.1 socket地址与API 一.理解字节序 主机字节序一般为小端字节序.网络字节序一般为大端字节序.当格式化的数据在两台使用了不同字节序的主机之间直接传递时,接收 ...
- 使用pycharm软件配置数据库可视化
必须品: pycharm软件,专业版最好自带就有,社区版就需要安装下插件. 专业版直接会在右边的编辑框浮动,直接点开就可以配置. 如图所示,点开就可以配置相应的数据库, 点开配置完毕就可以使用了. 还 ...
- Django2.1新手图文入门教程
第一个django Web Django2.1新手图文入门教程 http://www.liujiangblog.com/blog/36/
- Spring Cloud(八):配置中心(服务化与高可用)【Finchley 版】
Spring Cloud(八):配置中心(服务化与高可用)[Finchley 版] 发表于 2018-04-19 | 更新于 2018-04-26 | 本文接之前的<Spring Clou ...
- js屏蔽/过滤 特殊字符,输入就删除掉,实时删除
1.替换方法: <input type="text" class="domain" onkeyup="this.value=this.value ...
- ntp服务:实现时间同步
一. 引言 目前的项目为分布式系统,采用dubbo+zookeepe,排查BUG,发现各个服务器的时间不一致,遂网上查找资源,使得时间保持一致. 二. 步骤 1)以第一台服务器为“服务端”,其他台服务 ...