Cat VS Dog---hdu3829(最大独立集)
2015-08-13 15:26
393 查看
题目链接
题意:有n只猫,有m只狗。现在有P个学生去参观动物园。每个孩子有喜欢的动物和不喜欢的动物。假如他喜欢猫那么他就一定不喜欢狗(反之亦然)。
如果一个孩子喜欢一个动物,那么这个动物不会被移除,若是不喜欢则移除,这样这个孩子是很高兴的,反之亦然。
现在管理员想知道移除哪些动物可以使最大数量的孩子高兴。
对小孩进行二分匹配。就是把小孩当成点。矛盾的小孩间建立一条边,
最大独立集:在N个点中选出来一个最大点集,使这个点集中的任意两点之间都没有边。所以就是求最大独立集了
最大独立集 == 顶点数 - 最大匹配。
View Code
题意:有n只猫,有m只狗。现在有P个学生去参观动物园。每个孩子有喜欢的动物和不喜欢的动物。假如他喜欢猫那么他就一定不喜欢狗(反之亦然)。
如果一个孩子喜欢一个动物,那么这个动物不会被移除,若是不喜欢则移除,这样这个孩子是很高兴的,反之亦然。
现在管理员想知道移除哪些动物可以使最大数量的孩子高兴。
对小孩进行二分匹配。就是把小孩当成点。矛盾的小孩间建立一条边,
最大独立集:在N个点中选出来一个最大点集,使这个点集中的任意两点之间都没有边。所以就是求最大独立集了
最大独立集 == 顶点数 - 最大匹配。
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define N 510 int vis , used , maps , p, ans; struct node { char like , dislike ; }a ; bool Find(int u) { for(int i=1; i<=p; i++) { if(!vis[i] && maps[u][i]) { vis[i] = 1; if(!used[i] || Find(used[i])) { used[i] = u; return true; } } } return false; } int main() { int m, n; while(scanf("%d%d%d", &n, &m, &p) != EOF) { memset(maps, 0, sizeof(maps)); for(int i=1; i<=p; i++) { scanf("%s %s", a[i].like, a[i].dislike); for(int j=1; j<i; j++) { if(strcmp(a[i].like, a[j].dislike)==0 || strcmp(a[i].dislike, a[j].like)==0) maps[i][j] = maps[j][i] = 1; } } ans = 0; memset(used, 0, sizeof(used)); for(int i=1; i<=p; i++) { memset(vis, 0, sizeof(vis)); if(Find(i)) ans++; } printf("%d\n", p-ans/2); } return 0; }
View Code
相关文章推荐
- Vs2010 调试快捷键
- js实现类似微信网页版在可编辑的div中粘贴内容时过滤剪贴板的内容,光标始终在粘贴内容后面,以及将光标定位到最后的方法
- Highmaps网页图表教程之Highmaps第一个实例与图表构成
- oracle 登录
- css学习笔记之三
- Linux
- Boost::asio 学习笔记
- Telerk-asp.net 第三方控件之控件讲解 RadAjaxPanel(二)
- C# 代码片段
- html学习笔记(12)
- lvs增加并发连接,解决因为哈希表过小导致软中断过高问题
- 大根堆,小根堆
- QuizCardPlayer
- POJ 2965 The Pilots Brothers' refrigerator
- Android 联系人字母排序(仿微信)
- Android开发技巧——使用PopupWindow实现弹出菜单
- 数组排序 和 二分法查找
- 《开源框架那些事儿27》一段SQL引发的性能危机及其背后隐藏的设计缺陷
- (源)VC助手VA破解使用指南
- Android WebView常见问题解决方案汇总