题意:

会给出M个串,我们要做的就是将这M个串给清除了。对于任意两个串,若二进制形式只有一位不一样,那么这两个串可以在一次操作消除,否则每个操作只能消除一个串。

3 3

*01

100

011

可以代表的串是

001

101

100

011

那么我们可以先用 10*把 101 和 100 消除了,再用 0*1把001 和 011 消除了。故操作次数为 2。

解题思路:

我们可以将所有的串先化为整数,并去重。然后对二进制形式只有一位不一样的两个数,我们由含有偶数个1的数向含有奇数个1的数连边,这样就确保了一定是二分图,因为不存在同含奇数个1或同含偶数个1 的数只相差一位。最后进行求最大匹配,既是我们可以省去的操作数。所以我们求得最大独立集才是最终答案。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define Maxn 1200
  6. using namespace std;
  7. int graphic[Maxn][Maxn],vi[Maxn],match[Maxn],n,m,ans[Maxn],e;
  8. int dfs(int u)//匈牙利算法
  9. {
  10. int i;
  11. for(i=;i<=e;i++)
  12. {
  13. if(!vi[i]&&graphic[u][i])
  14. {
  15. vi[i]=;
  16. if(match[i]==-||dfs(match[i]))
  17. {
  18. match[i]=u;
  19. return ;
  20. }
  21. }
  22. }
  23. return ;
  24. }
  25. int main()
  26. {
  27. int i,j,k,Case=,a,b,num1,num2,Exp[];
  28. char str[];
  29. Exp[]=;
  30. for(i=;i<=;i++)
  31. Exp[i]=Exp[i-]*;
  32. while(scanf("%d%d",&n,&m),n||m)
  33. {
  34. memset(match,-,sizeof(match));
  35. memset(graphic,,sizeof(graphic));
  36. memset(ans,,sizeof(ans));
  37. e=;
  38. for(i=;i<=m;i++)
  39. {
  40. scanf("%s",&str);
  41. num1=;num2=-;
  42. for(j=n-;j>=;j--)
  43. {
  44. if(str[j]!='*')
  45. num1+=Exp[n-j-]*(str[j]-'');
  46. else
  47. num2=Exp[n-j-];
  48. }
  49. ans[++e]=num1;
  50. if(num2!=-)
  51. ans[++e]=num1+num2;
  52. }
  53. int num=;
  54. sort(ans+,ans+e+);//排完序后进行去重
  55. for(i=;i<=e;i++)
  56. if(ans[i]!=ans[num])
  57. ans[++num]=ans[i];
  58. e=num;
  59. for(i=;i<=e;i++)
  60. {
  61. for(j=i+;j<=e;j++)
  62. {
  63. int temp=(ans[i]^ans[j]);//找出不同位
  64. if((temp&(temp-))==)//若不同位只有一位,则为0
  65. {
  66. temp=ans[i];
  67. num=;
  68. while(temp)//求出二进制数1的个数
  69. {
  70. num++;
  71. temp=temp&(temp-);
  72. }
  73. if(num%==)//判断1的个数是奇数还是偶数
  74. graphic[i][j]=;
  75. else
  76. graphic[j][i]=;
  77. }
  78. }
  79. }
  80. num=;
  81. for(i=;i<=e;i++)
  82. {
  83. memset(vi,,sizeof(vi));
  84. if(dfs(i))
  85. num++;
  86. }
  87. printf("%d\n",e-num);
  88. }
  89. return ;
  90. }

poj 2724 二分图最大匹配的更多相关文章

  1. poj 2239 二分图最大匹配,基础题

    1.poj 2239   Selecting Courses   二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...

  2. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  3. POJ Evacuation /// 二分图最大匹配

    题目大意: 在一个n*m的房间中 ‘X’为墙 ‘D’为门 ‘.’为人 门只存在与外围 人每秒钟只能向四连通区域走一步 门比较狭窄 每秒钟只能通过一个人 求所有人逃脱的最短时间 如果不可能则输出impo ...

  4. Asteroids - poj 3041(二分图最大匹配问题)

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17258   Accepted: 9386 Description Be ...

  5. poj 2446 二分图最大匹配

    思路:由(i+j)为偶数的点向(i+j)为奇数的点建边.求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES. #include<iostream> #include<cs ...

  6. poj 1469 二分图最大匹配

    就是最简单的最大匹配,没的说 #include<iostream> #include<cstdio> #include<cstring> #include<a ...

  7. poj 1469(二分图 最大匹配)

    这道题让我认识到了c++cin,cout确实会使其超时,还是我用的c printf吧 #include<cstdio> #include<iostream> #include& ...

  8. POJ 1719 二分图最大匹配(记录路径)

    Shooting Contest Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4097   Accepted: 1499 ...

  9. poj 3692 二分图最大匹配

    思路: 如果我们将认识的建边,求最大独立集就是互相不认识的人数.那么我们反过来,将不认识的建图,求最大独立集就是互相认识的人数. #include<cstdio> #include< ...

随机推荐

  1. JSF 2 dropdown box example

    In JSF, <h:selectOneMenu /> tag is used to render a dropdown box – HTML select element with &q ...

  2. SaltStack安装(CentOS7.x)

    安装基础: 参考文档:https://docs.saltstack.com/en/latest/topics/installation/rhel.html 1.导入SaltStack仓库key: wg ...

  3. 面试之BI-SQL--table转换

    题目如下: Num 1 2 4 6 7 8 10 11 13 写条SQL语句转成下表: Column1  Column2 1              2 4              4 6     ...

  4. UVaLive 7267 Mysterious Antiques in Sackler Museum (if-else,枚举)

    题意:给定四个矩形,要求从中选出三个,能不能拼成一个矩形. 析:说到这个题,我还坑了队友一次,读题读错了,我直接看的样例,以为是四个能不能组成,然后我们三个就拼命想有什么简便方法,后来没办法了,直接暴 ...

  5. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(二)

    本文转载自 http://blog.csdn.net/cutesource/article/details/6192145 下面再来看看Tomcat是如何使用NIO来构架Connector这块的. 先 ...

  6. 创建虚拟交换机(New-VMSwitch)

    #获取网卡列表Get-NetAdapter

  7. linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)

    程序猿都非常懒,你懂的! 近期在开发中,须要用到server的ip和mac信息.可是server是架设在linux系统上的,对于多网口,在获取ip时就产生了非常大的问题.以下是在windows系统上, ...

  8. 用Eclipse来开发STM32

    先贴一个官方说明文档:http://www.keil.com/support/man/docs/ecluv/default.htm

  9. 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/ ...

  10. S5PV210开发系列四_uCGUI的移植

    S5PV210开发系列四 uCGUI的移植 象棋小子          1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...