poj 2724 二分图最大匹配
题意:
会给出M个串,我们要做的就是将这M个串给清除了。对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串。
3 3
*01
100
011
可以代表的串是
001
101
100
011
那么我们可以先用 10*把 101 和 100 消除了,再用 0*1把001 和 011 消除了。故操作次数为 2。
解题思路:
我们可以将所有的串先化为整数,并去重。然后对二进制形式只有一位不一样的两个数,我们由含有偶数个1的数向含有奇数个1的数连边,这样就确保了一定是二分图,因为不存在同含奇数个1或同含偶数个1 的数只相差一位。最后进行求最大匹配,既是我们可以省去的操作数。所以我们求得最大独立集才是最终答案。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define Maxn 1200
using namespace std;
int graphic[Maxn][Maxn],vi[Maxn],match[Maxn],n,m,ans[Maxn],e;
int dfs(int u)//匈牙利算法
{
int i;
for(i=;i<=e;i++)
{
if(!vi[i]&&graphic[u][i])
{
vi[i]=;
if(match[i]==-||dfs(match[i]))
{
match[i]=u;
return ;
}
}
}
return ;
}
int main()
{
int i,j,k,Case=,a,b,num1,num2,Exp[];
char str[];
Exp[]=;
for(i=;i<=;i++)
Exp[i]=Exp[i-]*;
while(scanf("%d%d",&n,&m),n||m)
{
memset(match,-,sizeof(match));
memset(graphic,,sizeof(graphic));
memset(ans,,sizeof(ans));
e=;
for(i=;i<=m;i++)
{
scanf("%s",&str);
num1=;num2=-;
for(j=n-;j>=;j--)
{
if(str[j]!='*')
num1+=Exp[n-j-]*(str[j]-'');
else
num2=Exp[n-j-];
}
ans[++e]=num1;
if(num2!=-)
ans[++e]=num1+num2;
}
int num=;
sort(ans+,ans+e+);//排完序后进行去重
for(i=;i<=e;i++)
if(ans[i]!=ans[num])
ans[++num]=ans[i];
e=num;
for(i=;i<=e;i++)
{
for(j=i+;j<=e;j++)
{
int temp=(ans[i]^ans[j]);//找出不同位
if((temp&(temp-))==)//若不同位只有一位,则为0
{
temp=ans[i];
num=;
while(temp)//求出二进制数1的个数
{
num++;
temp=temp&(temp-);
}
if(num%==)//判断1的个数是奇数还是偶数
graphic[i][j]=;
else
graphic[j][i]=;
}
}
}
num=;
for(i=;i<=e;i++)
{
memset(vi,,sizeof(vi));
if(dfs(i))
num++;
}
printf("%d\n",e-num);
}
return ;
}
poj 2724 二分图最大匹配的更多相关文章
- poj 2239 二分图最大匹配,基础题
1.poj 2239 Selecting Courses 二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...
- POJ 2226二分图最大匹配
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...
- POJ Evacuation /// 二分图最大匹配
题目大意: 在一个n*m的房间中 ‘X’为墙 ‘D’为门 ‘.’为人 门只存在与外围 人每秒钟只能向四连通区域走一步 门比较狭窄 每秒钟只能通过一个人 求所有人逃脱的最短时间 如果不可能则输出impo ...
- Asteroids - poj 3041(二分图最大匹配问题)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17258 Accepted: 9386 Description Be ...
- poj 2446 二分图最大匹配
思路:由(i+j)为偶数的点向(i+j)为奇数的点建边.求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES. #include<iostream> #include<cs ...
- poj 1469 二分图最大匹配
就是最简单的最大匹配,没的说 #include<iostream> #include<cstdio> #include<cstring> #include<a ...
- poj 1469(二分图 最大匹配)
这道题让我认识到了c++cin,cout确实会使其超时,还是我用的c printf吧 #include<cstdio> #include<iostream> #include& ...
- POJ 1719 二分图最大匹配(记录路径)
Shooting Contest Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4097 Accepted: 1499 ...
- poj 3692 二分图最大匹配
思路: 如果我们将认识的建边,求最大独立集就是互相不认识的人数.那么我们反过来,将不认识的建图,求最大独立集就是互相认识的人数. #include<cstdio> #include< ...
随机推荐
- Spring + JdbcTemplate + JdbcDaoSupport examples
In Spring JDBC development, you can use JdbcTemplate and JdbcDaoSupport classes to simplify the over ...
- MongoDB的备份与恢复
0. 目录 整库备份 整库恢复 单collection备份 单collection恢复 1. 备份 MongoDB提供了备份工具,mongodump.exe,在bin目录下,其用法如下: mongod ...
- poj 3026 Borg Maze (BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit:1000MS Memory Limit:65536KB 64bit IO For ...
- [C语言 - 7] 结构体struct
A. 基本知识 与数组的对比 数组: 构造类型 只能有多个相同类型的数据构成 结构体: 结构体类型 可以由多个不同类型的数据构成 1. 定义类型 struct Student { int ...
- js正则验证手机号
var regp = /^(\+86|86|)1[3458][0-9]{9}$/; if(str==""){ var flag = checkstatus(obj,"&q ...
- SSH登录失败:Host key verification failed
转载自:https://help.aliyun.com/knowledge_detail/41471.html 注意:本文相关 Linux 配置及说明已在 CentOS 6.5 64 位操作系统中进行 ...
- cocos2d-x CCListView
转自:http://blog.csdn.net/onerain88/article/details/7641126 cocos2d-x 2.0 版更新了,把opengl 1.1 替换为opengl 2 ...
- 关于MVC中DropDownListFor的一个bug
如以下代码: //后台 代码 ViewData["source_type"] = new List<SelectListItem> { "}, "} ...
- C#调用WORD处理的实例代码(包含excel)
最近程序人生(http://www.manong123.com)一个朋友让我帮他做一个小功能,其实就是把WORD文档里的内容存到数据库里去,可以实现搜索并转EXCEL的功能,需求很简单,想不到加上部署 ...
- C++ AfxBeginThread1
9*9乘法口诀 关键点 实现过程 在 class CMfc01Dlg : public CDialog { // Construction public: CMfc01Dlg(CWnd ...