[精]poj2724
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 5027 | Accepted: 1455 |
Description
One day, Mike's machine was infected. When
Mike found out, he had already done some operations and the cheeses operated by
this infected machine were infected too. He cleaned his machine as quickly as he
could, and now he needs to clean the infected cheeses with the minimum number of
operations. If a cheese is infected, cleaning this cheese with the machine one
or more times will make this cheese free from virus again; but if a cheese is
not infected, operation on this cheese will make it go bad.
Now given
the infected operations Mike has done, you need to find out the minimum number
of operations that must be performed to clean all the infected cheeses without
making any clean cheese go bad.
Input
with a line containing two numbers N and M (1 <= N <= 10, 1 <= M <=
1000). N is the number of switches in the machine and M is the number of
infected operations Mike has done. Each of the following M lines contains a
switch state of the machine. A test case with N = M = 0 ends the input and
should not be processed.
Output
integer, which is the minimum number of operations Mike needs to do.
Sample Input
3 3
*01
100
011
0 0
Sample Output
2
Source
题意:
题意:迈克有一台可以净化奶酪的机器,用二进制表示净化的奶酪的编号。但是,在某些二进制串中可能包含有‘*'。例如01*100,'*'其实就代表可以取0,1两种情况--> 010100 和011100。现在由于迈克不小心,他以同样的方式弄脏了某些奶酪,问你最少用多少次操作就可以把弄脏的奶酪全净化好。(没有被弄脏过的奶酪不能净化。弄脏过的奶酪可以多次净化。)
思路:
也就是给你一些不同的(判重之后)二进制串,每个串可以通过1次操作净化,也可以把两个只有1位不同的串通过1次操作联合净化.要我们求最少的操作次数.
我们把所有串按其中1的个数和是奇还是偶分成左右两个点集.
对于任意两个串,如果他们只有1位不同,那么就在他们之间连接一条无向边.(这两个串一定分别属于不同的点集)
由于串的总数是固定的,且一个串可以通过单独净化也可以通过联合净化.而我们向让净化的次数最少,我们自然想联合净化(即一次可以净化两个串)的次数尽量多了. 那么我们最多可以进行多少次联合净化呢? 这个数值==我们建立二分图的最大匹配边数.(想想是不是,因为一个串最多只能被净化一次)
假设总的不同串有n个,我们建立二分图的最大匹配数(即联合净化最大次数)为ans,那么我们总共需要n-ans次净化即可.(想想为什么)
当然本题也可以不用把串特意分成左右点集(本程序实现就是用的这种方式:未分左右点集),我们只需要把原图翻倍,然后求翻倍图的最大匹配数ans,最后用n-ans/2即可.
这个题中有很多位运算的有意思的东西
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=+;
int uN,vN;
int g[N][N];
int link[N];
int used[N];
int num[N];
int dfs(int u){
for(int v=;v<vN;v++)//顶点编号从0开始的
if(g[u][v]&&!used[v]){
used[v]=;
if(link[v]==-||dfs(link[v])){
link[v]=u;
return ;
}
}
return ;
}
int hungary(){
int res=;
memset(link,-,sizeof(link));
for(int u=;u<uN;u++){
memset(used,,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main(){
int n,m;
char str[];
while(scanf("%d%d",&n,&m)==&&(m+n)){
memset(g,,sizeof(g));
memset(num,,sizeof(num));
int cnt=;
while(m--){
cnt++;
scanf("%s",&str);
int pos=-;
for(int i=;i<n;i++){
if(str[i]=='*'){pos=i;continue;}
num[cnt]|=(str[i]-'')<<i;
}
if(pos!=-){
cnt++;
num[cnt]=(num[cnt-]|(<<pos));
}
}
sort(num+,num+cnt+);
num[]=-;
int i,j;
for(j=,i=;i<=cnt;i++){
if(num[j]!=num[i])
num[++j] = num[i];
}
cnt=j;
for(i=;i<=cnt;i++)
for(j=;j<=cnt;j++){
int c=num[i]^num[j];
if(c&&((c&(c-))==))g[num[i]][num[j]]=;
}
uN=vN=;
int ans=cnt-hungary()/;
printf("%d\n",ans);
}
return ;
}
[精]poj2724的更多相关文章
- MVVM大比拼之AngularJS源码精析
MVVM大比拼之AngularJS源码精析 简介 AngularJS的学习资源已经非常非常多了,AngularJS基础请直接看官网文档.这里推荐几个深度学习的资料: AngularJS学习笔记 作者: ...
- MVVM大比拼之vue.js源码精析
VUE 源码分析 简介 Vue 是 MVVM 框架中的新贵,如果我没记错的话作者应该毕业不久,现在在google.vue 如作者自己所说,在api设计上受到了很多来自knockout.angularj ...
- MVVM大比拼之knockout.js源码精析
简介 本文主要对源码和内部机制做较深如的分析,基础部分请参阅官网文档. knockout.js (以下简称 ko )是最早将 MVVM 引入到前端的重要功臣之一.目前版本已更新到 3 .相比同类主要有 ...
- 【转】《从入门到精通云服务器》第六讲—OpenStack基础
前五期的<从入门到精通云服务器>受到了广泛好评,收到留言,有很多读者对云计算相关的技术非常感兴趣.应观众要求,我们这期要安利一条纯技术内容.准备好瓜子.花生,随小编一起进入OpenStac ...
- Replace 删除、替换函数精解示例
'************************************************************************* '**模 块 名:Replace函数精解示例 '* ...
- Filter 数组过滤函数精解示例
'************************************************************************* '**模 块 名:Filter 数组过滤函数精解示 ...
- 《javascript面向对象精要》读书笔记
<javascript面向对象精要> 买这本书的原因主要是因为作者,Nicholas C. Zakas 牛X闪闪的js专家,读过js高程的应该都知道他,而这本书是他的最新力作,感觉也是js ...
- MATLAB神经网络原理与实例精解视频教程
教程内容:<MATLAB神经网络原理与实例精解>随书附带源程序.rar9.随机神经网络.rar8.反馈神经网络.rar7.自组织竞争神经网络.rar6.径向基函数网络.rar5.BP神经网 ...
- 通过实战理解C语言精要——函数篇
前言 本篇博客是对C语言函数部分的重点内容和细枝末节通过实战得到的经验的总结精炼,不涵盖C语言函数的全部内容,所有提炼内容均来自提炼与实战,阅读需要对函数部分有一定基础,可用于对C语言函数的理解提 ...
随机推荐
- 矩阵压缩写法 scipy spark.ml.linalg里都有,CRS,CCS
CRS 表示:Compressed Row Storage CCS 表示:Compressed Column Storage CRS的表示参考: https://blog.csdn.net/buptf ...
- linux 关闭ping探测
先切换到root echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 1代表关闭 0代表开启 用iptables iptables -I INPUT ...
- jQuery的AJax异步载入片段
主要用到load()方法以及getScript()方法,详细以一个样例说明: 在现有html文件里载入一个拟好的片段,以及在片段载入完毕之前阻止用户进一步操作的弹出框. 首先是现有html代码.无不论 ...
- vue笔记二
七.列表渲染 1.示例 <ul id="example-2"> <li v-for="(item, index) in items"> ...
- python——type()创建类
今天我算是长知识了,我是一个python菜鸟,以前一直认为type(A)可以返回A的类型,但是不知道type还可以用于创建class,这篇经验就是介绍一下如何用type()创建一个类,以及如何设置该类 ...
- d3.js封装文本实现自动换行和旋转平移等功能
我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧. 一.引用 multext.js 文件 multext.js function appendMulti ...
- jm解决乱码问题-参数化-数据库操作-文件上传下载
jm解决乱码问题-参数化-数据库操作-文件上传下载 如果JM出果运行结果是乱码(解决中文BODY乱码的问题) 找到JM的安装路径,例如:C:\apache-jmeter-3.1\bin 用UE打开jm ...
- 动态添加ImageView 设置setPadding不起作用问题
imageView = new ImageView(NavigationActivity.this); imageView.setLayoutParams(new LayoutParams(12,12 ...
- Paxos 学习总结
近期学习了分布式领域的重要算法Paxos,这里罗列下关键点当作总结.自己水平有限,难免存在谬误,恳请读者指正.本篇不包含Paxos的基本理论介绍.Paxos基础能够參考以下的学习资料章节. 1 Pax ...
- SpringCloud系列五:为Eureka Server添加用户认证及元数据
1. 回顾 上一篇博客讲解了Eureka集群及将微服务注册到集群上.在前面的讲解中,Eureka Server都是允许匿名访问的,本次将讲解如何构建一个需要登录才能访问的Eureka Server. ...