标签:
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