题意

给定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. mysql 修复_修复崩溃的Mysql
  2. 解决方案、项目、程序集、命名空间
  3. Spring Cloud Feign设计原理
  4. 测试版降级后软件还在么,如果你后悔安装iOS12想降到iOS11?几招教你删除iOS12测试版...
  5. track文件 什么是git_Git 从入门到放弃命令大全
  6. 知识图谱概念与知识图谱构建流程(KGC)总览
  7. Ordinal Regression with Multiple Output CNN for Age Estimation-(系列一_年龄估计)
  8. 都说IT行业有前景,请问凭什么?
  9. 保存新浪微博中的作品视频的技巧
  10. mysql 不建议delete?
  11. 中英文情感分析模型汇总
  12. 【Linux】——用户账号和组账号
  13. ZIP压缩算法详细分析及解压实例解释
  14. 自定义dns服务器faq,常见手机品牌的DNS修改方法
  15. 你需要知道的 TCP 三次握手
  16. OSChina 周六乱弹 ——所以会魔法的人都是孤独的
  17. 各大网站瀑布流简析与建议
  18. .net core依赖注入
  19. Ipad全线涨价;马斯克计划未来数月裁掉推特 75% 员工;支付宝已支持给微信QQ好友转账 | EA周报...
  20. 网易视频云技术分享:HBase - 建表语句解析

热门文章

  1. Java监听器完整入门实例
  2. springmvc+spring+mybatis基于soa架构进行框架整合思路分析
  3. 80070583类不存在_结合JVM源码谈Java类加载器
  4. python文件中环境声明_Python环境构建
  5. python装饰器 property_python中property和setter装饰器用法
  6. Qt Creator常用快捷键及技巧提升编码效率
  7. python cv2 matchtemplate_OpenCV-Python系列十:模板匹配
  8. 1.2.4 计算机的工作过程(从源程序到可执行文件、指令执行过程的描述)
  9. 面向对象3(final、static、instanceof、向上/向下转型、初始化次序)
  10. win10 下用 vs code 编译调试代码的过程 (MinGW)