HDU3829 Cat VS Dog(最大独立集)
2016-05-17 17:13
239 查看
题意:
n个小孩,每个小孩喜欢一种动物讨厌一种动物
你是管理员,可以任意去掉一些动物
当小孩讨厌的动物被去掉并且喜欢的动物没有被去掉时,
他是开心的
问最多让多少小孩开心
思路:
让有矛盾的小孩建边,求最大独立集即可
n个小孩,每个小孩喜欢一种动物讨厌一种动物
你是管理员,可以任意去掉一些动物
当小孩讨厌的动物被去掉并且喜欢的动物没有被去掉时,
他是开心的
问最多让多少小孩开心
思路:
让有矛盾的小孩建边,求最大独立集即可
/* *********************************************** Author :devil Created Time :2016/5/17 17:13:21 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int N=510; int link ,c,d,n; string s1 ,s2 ; bool vis ; vector<int>eg ; bool dfs(int u) { for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(!vis[v]) { vis[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return 1; } } } return 0; } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d%d",&c,&d,&n)) { memset(link,-1,sizeof(link)); for(int i=1;i<=n;i++) eg[i].clear(); for(int i=1;i<=n;i++) cin>>s1[i]>>s2[i]; for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) { if(s1[i]==s2[j]||s1[j]==s2[i]) { eg[i].push_back(j); eg[j].push_back(i); } } } int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); ans+=dfs(i); } printf("%d\n",n-ans/2); } return 0; }
相关文章推荐
- Excel多行转多列
- lvm逻辑卷操作
- Microsoft Azure系列之五 使用IaaS 虚拟机
- 华为S5700实现两个VLAN间不通信的ACL策略
- 搜索类 总结
- QQ登录100044错误解决
- 我的Python成长之路---第八天---Python基础(25)---2016年3月5日(晴)
- 数据库设计性能与效率
- Java基础01---操作符
- hdu 1690(Floyed)
- js禁止网页快捷菜单
- android 获取sdcard 和内存使用情况
- 应用系统数据缓存设计
- dataGrid中的行编辑功能
- 百炼 2797:最短前缀
- 个人随笔之---开发感悟
- spark性能调优:资源优化
- Oracle Database 12c In-Memory 学习推荐博文
- N皇后问题
- SELECT 顺序