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

最新文章

  1. Java导入的项目乱码怎么解决?(Ⅰ)
  2. VAssistX使用小窍门
  3. 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案
  4. JavaScript——callback(回调函数
  5. 对List中对象的去重
  6. javascript数组详解
  7. Visual Studio 调用 Delphi DLL 会退出的解决方案
  8. 探索AutoLayout的本质和解决一些问题
  9. 人人都是CEO
  10. 第四篇:Web框架 - Django
  11. EBS财务模块表结构
  12. postgresql9.1数据库加解密
  13. STM32学习笔记:【004】USART串口通信
  14. 温顾知新系列-JAVA网络编程系统(1)- 流
  15. MyEclipse新建工作空间后的配置详细步骤
  16. 一款易搭建,运行快的Git服务器:Gitea安装教程
  17. Mybatis的SqlSession理解(二)
  18. ASP.NET MVC 实现有论坛功能的网站(有iis发布网站)
  19. Linux常用命令 - ls
  20. 程序中try、throw、catch三者之间的关系

热门文章

  1. 使用apache cgi运行ruby脚本
  2. CC3200-LAUNCHXL仿真器驱动异常(未完成)
  3. 可靠UDP,KCP协议快在哪?
  4. JEMTER简单的测试计划
  5. 对网页进行截图(selenium)
  6. HTMLTestRunner.py(Python3)
  7. Spring Cloud(九):配置中心(消息总线)【Finchley 版】
  8. lintcode407 加一
  9. #pragma pack(n)对齐格式
  10. Centos6设置DNS