POJ - 2724 Purifying Machine 二分图 最大匹配
来源:互联网 发布:阿里云 证书被ios信任 编辑:程序博客网 时间:2024/06/06 01:05
题目大意:看了别人的题意:
给出m串长度为n的01串,如果某个串中包含‘*‘号的,那么这个串就可以变成两个串(因为‘*‘既可以表示0或者1)
比如字符串*01就可以表示成001,或者101
现在的任务是消除所有的串,给出消除串的规则如下:
1一次消灭一个串。
2如果两个串的差别只有一位的话可以同时消灭这两个串。
问至少需要多少次才能消灭这些串
解题思路:先将这些串去重,化成整数,这样就可以得到两个点集了,点集之间的关系就是一个操作能否消除掉两个串,如果可以的话,则这两个串就存在关系了
#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int N = 2100;int n, m, t_num, num[N],link[N], vis[N];vector<int> g[N];char str[15];int bitcount(int x) { return x == 0 ? 0 : bitcount(x >> 1) + (x & 1);}void init() { num[0] = -1; int cnt = 1; for(int i = 0; i < m; i++) { scanf("%s", str); num[cnt] = 0; for(int j = n - 1; j >= 0; j--) num[cnt] = 2 * num[cnt] + (str[j] != '0'); cnt++; for(int j = 0; j < n; j++) if(str[j] == '*') { num[cnt] = num[cnt - 1]; num[cnt] ^= (1 << j); cnt++; } } sort(num, num + cnt); t_num = 1; for(int i = 1; i < cnt; i++) if(num[i] != num[i-1]) num[t_num++] = num[i]; for(int i = 1; i < t_num; i++) { g[i].clear(); for(int j = 1; j < i; j++) if(bitcount(num[i] ^ num[j]) <= 1) { g[i].push_back(j); g[j].push_back(i); } } memset(link, 0, sizeof(link));}bool dfs(int u) { for(int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if(vis[v]) continue; vis[v] = 1; if(!link[v] || dfs(link[v])) { link[v] = u; return true; } } return false;}void hungary() { int ans = 0; for(int i = 1; i < t_num; i++) { memset(vis, 0, sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n", t_num - ans / 2 - 1);}int main() { while(scanf("%d%d", &n, &m) != EOF && n + m) { init(); hungary(); } return 0;}
0 0
- 【二分图+最大匹配】北大 poj 2724 Purifying Machine
- poj 2724 Purifying Machine 二分图最大匹配
- POJ 2724 Purifying Machine(二分图最大匹配)
- POJ - 2724 Purifying Machine 二分图 最大匹配
- POJ 2724 Purifying Machine(二分图最大匹配)
- poj 2724 Purifying Machine(二分图最大匹配)
- poj 2724 Purifying Machine 二分匹配
- POJ 2724 Purifying Machine (二分图最大独立集Hungary)
- 【uva 1663】Purifying Machine 二分图匹配
- POJ 2724 Purifying Machine
- POJ-2724-Purifying Machine
- POJ 2724 Purifying Machine
- UVa 1663 - Purifying Machine(二分匹配)
- POJ 2724 Purifying Machine(最大独立集)
- poj - 1325 - Machine Schedule(二分图最大匹配)
- 【二分图|最大匹配】POJ-1325 Machine Schedule
- POJ 1325 Machine Schedule (最大二分匹配)
- POJ2724 Purifying Machine(二分图)
- 在Ubuntu上通过ssh远程挂载数莓派的共享目录(也可以是根目录)
- redis教程02
- 链表相邻元素翻转
- Remove Nth Node From End of List
- C++之父:C++ 的五个普遍误解
- POJ - 2724 Purifying Machine 二分图 最大匹配
- Winsock编程流程(1)-TCP/IP
- git忽略对已入库文件的修改
- 整合spring、redis
- TCP/IP, WebSocket 和 MQTT
- leetcode[104]:Maximum Depth of Binary Tree
- Java NIO:NIO概述
- 下面宏的作用是什么 结构体
- SAT数学:必背公式之三角函数