您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: