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< ...
随机推荐
- JSF 2 dropdown box example
In JSF, <h:selectOneMenu /> tag is used to render a dropdown box – HTML select element with &q ...
- SaltStack安装(CentOS7.x)
安装基础: 参考文档:https://docs.saltstack.com/en/latest/topics/installation/rhel.html 1.导入SaltStack仓库key: wg ...
- 面试之BI-SQL--table转换
题目如下: Num 1 2 4 6 7 8 10 11 13 写条SQL语句转成下表: Column1 Column2 1 2 4 4 6 ...
- UVaLive 7267 Mysterious Antiques in Sackler Museum (if-else,枚举)
题意:给定四个矩形,要求从中选出三个,能不能拼成一个矩形. 析:说到这个题,我还坑了队友一次,读题读错了,我直接看的样例,以为是四个能不能组成,然后我们三个就拼命想有什么简便方法,后来没办法了,直接暴 ...
- 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(二)
本文转载自 http://blog.csdn.net/cutesource/article/details/6192145 下面再来看看Tomcat是如何使用NIO来构架Connector这块的. 先 ...
- 创建虚拟交换机(New-VMSwitch)
#获取网卡列表Get-NetAdapter
- linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)
程序猿都非常懒,你懂的! 近期在开发中,须要用到server的ip和mac信息.可是server是架设在linux系统上的,对于多网口,在获取ip时就产生了非常大的问题.以下是在windows系统上, ...
- 用Eclipse来开发STM32
先贴一个官方说明文档:http://www.keil.com/support/man/docs/ecluv/default.htm
- Codeforces Beta Round #51 C. Pie or die 博弈论找规律 有趣的题~
C. Pie or die Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55/problem/ ...
- S5PV210开发系列四_uCGUI的移植
S5PV210开发系列四 uCGUI的移植 象棋小子 1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...