标签:
http://acm.hdu.edu.cn/showproblem.php?pid=3829
1 1 2 C1 D1 D1 C1 1 2 4 C1 D1 C1 D1 C1 D2 D2 C1
1 3HintCase 2: Remove D1 and D2, that makes child 1, 2, 3 happy.
/**
hdu 3829 二分图的最大独立集
题目大意:有k个小孩,n只狗,m只猫,每个小孩喜欢一个宠物,讨厌一个宠物,若我们拿走一个小孩讨厌的宠物,而剩下的
有该小孩喜欢的宠物,那么这个小孩就会高兴。问怎么样拿可以使最多的小孩高兴。
解题思路:二分图的最大独立集问题,对于两个不能同时高兴的小孩建边,最后最大独立集=k-最大匹配数。难在建边
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=505;
int k,n,m;
int w[maxn][maxn];
bool used[maxn];
int linker[maxn];
bool dfs(int u)
{
int v;
for(v=0;v<k;v++)
{
if(w[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{
linker[v]=u;
return true;
}
}
}
return false;
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=0;u<k;u++)
{
memset(used,0,sizeof(used));
if(dfs(u))res++;
}
return res;
}
char like[maxn][5],dislike[maxn][5];
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
for(int i=0;i<k;i++)
{
scanf("%s%s",like[i],dislike[i]);
}
memset(w,0,sizeof(w));
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
if(strcmp(like[i],dislike[j])==0||strcmp(dislike[i],like[j])==0)
{
w[i][j]=1;
}
}
}
printf("%d\n",k-hungary()/2);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/44180443