HDU 3829 Cat VS Dog (二分匹配求最大独立集)
2012-09-23 10:25
441 查看
Cat VS Dog
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)Total Submission(s): 1770 Accepted Submission(s): 600
[align=left]Problem Description[/align]
The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-animal and a dislike-animal, if the child's like-animal is a cat, then his/hers dislike-animal must be a dog, and vice versa.
Now the zoo administrator is removing some animals, if one child's like-animal is not removed and his/hers dislike-animal is removed, he/she will be happy. So the administrator wants to know which animals he should remove to make maximum number of happy children.
[align=left]Input[/align]
The input file contains multiple test cases, for each case, the first line contains three integers N <= 100, M <= 100 and P <= 500.
Next P lines, each line contains a child's like-animal and dislike-animal, C for cat and D for dog. (See sample for details)
[align=left]Output[/align]
For each case, output a single integer: the maximum number of happy children.
[align=left]Sample Input[/align]
1 1 2 C1 D1 D1 C1 1 2 4 C1 D1 C1 D1 C1 D2 D2 C1
[align=left]Sample Output[/align]
1 3
Hint
Case 2: Remove D1 and D2, that makes child 1, 2, 3 happy.
[align=left]Source[/align]
2011 Multi-University Training Contest 1 - Host by HNU
[align=left]Recommend[/align]
xubiao
此题一看就想到用二分匹配做。但是考虑到可能很多小孩喜欢一样的,感觉二分匹配不行。。。然后又想到最大权匹配。。。结果还是不行。
最后转换下思维,对小孩进行二分匹配。就是把小孩当成点。矛盾的小孩间建立一条边。
这样就转化成求最大独立集了。
/* HDU 3829 求最大独立集 */ #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> using namespace std; //************************************************ const int MAXN=1505;//这个值要超过两边个数的较大者,因为有linker int linker[MAXN]; bool used[MAXN]; vector<int>map[MAXN]; int uN; bool dfs(int u) { for(int i=0;i<map[u].size();i++) { if(!used[map[u][i]]) { used[map[u][i]]=true; if(linker[map[u][i]]==-1||dfs(linker[map[u][i]])) { linker[map[u][i]]=u; return true; } } } return false; } int hungary() { int u; int res=0; memset(linker,-1,sizeof(linker)); for(u=0;u<uN;u++) { memset(used,false,sizeof(used)); if(dfs(u)) res++; } return res; } //***************************************************** char like[MAXN][5]; char dislike[MAXN][5]; int main() { int n,m,p; while(scanf("%d%d%d",&n,&m,&p)!=EOF) { for(int i=0;i<MAXN;i++)map[i].clear(); for(int i=0;i<p;i++) { scanf("%s%s",&like[i],&dislike[i]); } uN=p; for(int i=0;i<p;i++) for(int j=i+1;j<p;j++) if(strcmp(like[i],dislike[j])==0 || strcmp(like[j],dislike[i])==0) { map[i].push_back(j); map[j].push_back(i); } printf("%d\n",p-hungary()/2); } return 0; }
相关文章推荐
- hdu 3829 Cat VS Dog (二分匹配 求 最大独立集)
- ★hdu 3829 Cat VS Dog (最大独立集)
- hdu 4169 二分匹配最大独立集 ***
- HDU 1068 Girls and Boys 二分图最大独立集(最大二分匹配)
- hdu 1068 Girls and Boys(最大独立集,二分匹配)
- HDU 2768 Cat vs. Dog 【二分匹配之最大独立集】
- hdu 2768 (二分匹配,最大独立集)
- HDU 1068 Girls and Boys【二分匹配之最大独立集】
- HDU 3829 - Cat VS Dog【二分图最大匹配最大独立集】
- HDU 3829 二分最大独立集
- HDU5556Land of Farms 【二分匹配+最大独立集+奇偶分类】
- HDU 3829 Cat VS Dog(最大独立集|二分图最大匹配)
- HDU 3829 Cat VS Dog 最大独立集(最大匹配)
- hdu 3829 Cat VS Dog 最大点独立集
- HDU 3829 — Cat VS Dog 最大独立集
- HDU 3829 Cat VS Dog-二分匹配&最大点集
- POJ 1466 二分匹配 最大独立集
- HDU 2063 过山车 第一道最大二分匹配
- hdu 2444 The Accomodation of Students(是否二分图,找二分最大匹配数)
- HDU 3829 最大du立集=2个点集点数-最大匹配数