博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2724 Purifying Machine(二分图)
阅读量:7105 次
发布时间:2019-06-28

本文共 2130 字,大约阅读时间需要 7 分钟。

题意:

有2^n个奶酪,对应二进制的数,用清理机输入一个二进制数可以清理对应的奶酪,含有*的算成0和1两个,每次只能出现一个*,现在清理机自身感染细菌,它清理的奶酪都被感染,将清理机消毒后,问最少清理几次能把所有感染的奶酪清理干净。

要点:

这题比较复杂,题意就比较难看懂,算是一个有向图的最大匹配问题,因为带*的同时可以清理两个,所以就是求最多能有几个*,最后结果:总数-最大匹配数,将所有只差一位的二进制数建图,注意这个图是有向图,因为两个只差一位的数合并成一个,建图时是遍历所有的点,一个点用完后和它连接的点会再次出现,而我们要求只匹配一次即可,所以求出的ans/2。这题还有两个要注意的地方:

1.判重,所有的输入中会出现相同的数,所以最后如果直接用这个数-ans/2会失败,所以判重去除重复数。

2.判断二进制是否只差一位,首先设一个数C,C=A^B,根据异或判断,相同的为0,不同的为1,所以如果只差一位C!=0,但这样是不够的,可能出现差两位的情况,那么就判断(C&(C-1))==0,如果只差一位,C中只有第i位一个1,那么C-1就是i-1……0都是1,其余为0,可以看出是没有相同位的,如果差两位及以上,就会出现相同位,最后合并判断这个式子即可:c && ((c&(c - 1)) == 0),注意这里的优先级比较混乱,最好一步一个括号。这种方法只能判断差一位的情形,不能同过-3,-2判断是否差3位或两位。

15491157 Accepted 16652K 719MS 1649B 2016-05-11 07:25:35
#include
#include
#include
#include
using namespace std;#define maxn 2050int map[maxn][maxn], used[maxn], edge[maxn], girl[maxn];int n, m;bool find(int x){ int i; for (i = 0; i < maxn; i++) { if (map[x][i] && !used[i]) { used[i] = 1; if (girl[i] == -1 || find(girl[i])) { girl[i] = x; return true; } } } return false;}int main(){ int i,j, num,temp,count; char s[15]; while (scanf("%d%d", &n, &m), n + m) { memset(map, 0, sizeof(map)); memset(girl, -1, sizeof(girl)); count = 0; while (m--) { scanf("%s", s); num = 0; temp = -1; for (i = 0; i < strlen(s); i++) { if (s[i] == '*') temp = i; else num += (s[i] - '0')*(1 << strlen(s) - i - 1); } if (temp == -1) edge[count++] = num; else { edge[count++] = num; edge[count++] = num + (1 << strlen(s) - temp - 1); } } sort(edge, edge + count); int sum = 1; for (i = 1; i < count; i++) if (edge[i] != edge[i - 1]) edge[sum++] = edge[i];//count中有可能出现重复的,所以要判重 for (i = 0; i < sum; i++) for (j = 0; j < sum; j++)//这里算出的ans是两倍 { int c1 = edge[i]; int c2 = edge[j]; int c = c1^c2; if (c && ((c&(c - 1)) == 0))//注意这里的括号不能节省,优先度比较麻烦干脆全写括号 map[c1][c2] = 1; } int ans = 0; for (i = 0; i < maxn; i++) { memset(used, 0, sizeof(used)); if (find(i)) ans++; } printf("%d\n",sum-ans/2); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343746.html

你可能感兴趣的文章
辽宁打造东北大数据产业中心
查看>>
【大数据播报】IT圈儿的“网红”究竟是谁?
查看>>
小巧省电高性能:中科创达用创新技术助力ROLLCAP云台相机上市
查看>>
微软兼并Linkedln的六大作用
查看>>
制造业ERP的核心:生产控制
查看>>
物联网智能技术引领互联网新风潮
查看>>
汇量科技1172万美元收购欧洲移动游戏数据分析公司
查看>>
深度融合信息化 视频监控打击震慑犯罪
查看>>
智能家居未来已来,可没做到这点便是“鸡肋”!
查看>>
北卡一号光伏电站全容并网
查看>>
欧盟向美社交网络发出通牒 限期一月修改服务条款否则罚款
查看>>
等等AMD!英特尔最新路线图曝10nm延期
查看>>
无线领军企业的5G之路
查看>>
Android应用自动化测试——理论、工具和实践(上)
查看>>
《Clojure数据分析秘笈》——1.9节从网页中抓取文本数据
查看>>
WordPress 4.6.1 安全修复版发布
查看>>
保护普通用户上网安全 iOS版WiFi万能钥匙推出安全险
查看>>
链家跨界合作今日头条,大数据将重塑房产交易服务
查看>>
Chinapex创略宣布完成A轮融资 打造企业级数据驱动营销云平台
查看>>
Snapchat 首份成绩单表现不好,它未来还有更多“劫”要渡
查看>>