题意

给定m个长度为n的01串(*既表示0 or 1。如*01表示001和101)。现在要把这些串都删除掉,删除的方法是:①一次删除任意指定的一个;②如果有两个串仅有一个字符不同,则可以同时删除这两个。求最少要多少次可以删完,并且同一个串不能删两次。

思路

我们用点表示一个串,如果两个串之间只有一个字符不同,那么这两个串之间连接一条,最大匹配数就是节省的次数。 因为每个串中的1为奇数的串之间是不能匹配的(不可能只有1个不同),同理,偶数也是。所以,可以按照1的奇偶性把数据分成2份,所以是一个二分图匹配。然后答案就是所有串数 - 最大匹配数。

代码


#include
#include
#include
#include
#include
#include
#define MID(x,y) ((x+y)/2)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXV = 2005;                   //N1+N2
vector  adj[MAXV];
struct MaximumMatchingOfBipartiteGraph{int vn;void init(int n){                   //二分图两点集点的个数vn = n;for (int i = 0; i <= vn; i ++)     adj[i].clear();}void add_uedge(int u, int v){adj[u].push_back(v);adj[v].push_back(u);}bool vis[MAXV];int mat[MAXV];                      //记录已匹配点的对应点bool cross_path(int u){for (int i = 0; i < (int)adj[u].size(); i ++){int v = adj[u][i];if (!vis[v]){vis[v] = true;if (mat[v] == 0 || cross_path(mat[v])){mat[v] = u;mat[u] = v;return true;}}}return false;}int hungary(){mem(mat, 0);int match_num = 0;for (int i = 1; i <= vn; i ++){mem(vis, 0);if (!mat[i] && cross_path(i)){match_num ++;}}return match_num;}void print_edge(){for (int i = 1; i <= vn; i ++){for (int j = 0; j < (int)adj[i].size(); j ++){printf("u = %d v = %d\n", i, adj[i][j]);}}}
}match;vector  s;
int main(){//freopen("test.in", "r", stdin);//freopen("test.out", "w", stdout);int n, m;while(scanf("%d %d", &n, &m), n+m){getchar();s.clear();for (int i = 1; i <= m; i ++){char tmps[15];scanf("%s", tmps);int star = -1;for (int j = 0; j < n; j ++){if (tmps[j] == '*'){star = j;break;}}if (star == -1){if (find(s.begin(), s.end(), tmps) == s.end())s.push_back(string(tmps));}else{tmps[star] = '0';if (find(s.begin(), s.end(), tmps) == s.end())s.push_back(string(tmps));tmps[star] = '1';if (find(s.begin(), s.end(), tmps) == s.end())s.push_back(string(tmps));}}match.init(s.size());for (int i = 0; i < s.size(); i ++){for (int j = 0; j < i; j ++){int dif = 0;for (int k = 0; k < n; k ++){if (s[i][k] != s[j][k]){dif ++;if (dif > 1)break;}}if (dif == 1){match.add_uedge(j+1, i+1);}}}printf("%d\n", s.size() - match.hungary());}return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114077.html

POJ 2724 Purifying Machine (二分图匹配)相关推荐

  1. 【Step1】【二分图匹配】poj 1274-The Perfect Stall

    题目链接 题目大意 输入数据中,第一行给出n,表示n个奶牛. 接下来n行,每行一个x,xi表示第i头奶牛可以选择x个谷仓中的一个进行匹配.接下来x个数,表示谷仓的编号(1~n之间) 一个谷仓也只能有一 ...

  2. 二分图匹配 Hopcroft-Carp (HK) 算法详解 附例题

    了解这个算法之前 首先了解一个概念 :增广路 增广路 :简单的说 ,是二分图匹配中的一条边,他总是从 左边集合的一个点出发通过一条没有被匹配的边连接到右边集合,再从该点通过一条 匹配过的边连接到右边集 ...

  3. Dinic二分图匹配 || Luogu P3386

    题面:[模板]二分图匹配 思路:Dinic实现二分图匹配,要建一个超级源点(S)和超级汇点(T),分别定为N+M+1和N+M+2 然后S去和N中的数建正边和反边,正边权值为1,反边权值为0:M中的数去 ...

  4. 二分图匹配匈牙利算法DFS实现

    1 /*==================================================*\ 2 | 二分图匹配(匈牙利算法DFS 实现) 3 | INIT: g[][]邻接矩阵; ...

  5. poj1274(二分图匹配)

    (一道基础的二分图匹配) 题目意思大概为N个牛和M个栅栏,一个牛和一个栅栏只能匹配一次,求最大匹配 直接套用二分图最大匹配模板即可 #include <iostream> #include ...

  6. poj2724(二分图匹配)

    题目大概意思为有部分奶酪需要处理,若两个奶酪的二进制只有一位不同,则可以一起处理,问最少需要处理几次 题目思路: 将可以一起处理的两个奶酪用边连接在一起,相当于边只连接二进制中有偶数个1的奶酪和二进制 ...

  7. 算法模板——二分图匹配

    实现功能为二分图匹配 原理:匈牙利算法,核心思想--匹配上了就配,没直接匹配上也要通过前面的腾出位置让这个匹配上(详见:趣写算法系列之--匈牙利算法) 本程序以Codevs2776为例 详见Codev ...

  8. 算法:ACM二分图匹配 HDU2063

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2063 摘录于互联网,原创作者redraiment,很详细的二分图匹配入门资料! 2063 过山车 Pr ...

  9. BZOJ1433 [ZJOI2009]假期的宿舍 - 二分图匹配

    题解 一道裸的二分图匹配,稍微有一点细节需要注意, 但是非常裸= = 本校并且住校的向自己的床和 自己认识的并且本校的人的床连边 离校的不需要向外连边 不是本校的就和自己认识的 并且是本校的人的床连边 ...

最新文章

  1. Activity的生命周期是谁调用的?
  2. Win7下Event_Log服务4201错误的有效解决方法
  3. nanopi基础配置
  4. 3D角色设定全析百图斩
  5. [SDOI2011]消耗战
  6. MaxCompute存储力持续升级,每年节省不止一个亿
  7. eclipse jrebel插件
  8. 【OpenCV】OpenCV函数精讲之 -- 感兴趣区域ROI
  9. 8月9日发布!华为EMUI 10将在华为开发者大会上登场
  10. linux 快组描述符,Linux 进程描述符 task struct
  11. python字符串format格式化二
  12. 铵钮提交事件PostBack之后,一些动态加载的物件丢失
  13. 发现TP5一个神奇的问题
  14. Java基础知识回顾--正则表达式
  15. python 打开txt_python编程之文件操作
  16. 基于JavaWeb的小说阅读网站设计与实现 毕业论文+答辩PPT+项目源码及数据库文件
  17. 魔窗--H5网页唤醒APP
  18. html是什么意思网络用语,网络用语内涵是什么意思
  19. lol进入服务器后显示3秒白屏,LOL:盘点新客户端出现的BUG,及可行的解决方法...
  20. python字母对应数字上海迪士尼残疾人门票_所有景点提供无障碍设施 残障人士也能玩转上海迪士尼...

热门文章

  1. Python爬虫开发:opener的使用案例
  2. kibana操作elasticsearch:新增数据(随机生成id)
  3. eureka client客户端启动时都做了哪些事
  4. linux系统修改系统时间
  5. java set path_Java Path.setEffect方法代码示例
  6. python实验报告二_分组级运算和转换
  7. html加载完显示图片,js图片未加载完显示loading效果
  8. java 以什么开头_判断字符串以什么开头
  9. 2.3.1 进程的同步与互斥
  10. android studio异步单元测试,在Android Studio中可以进行单元测试