HDU 3829 Cat VS Dog【最大独立集】
题意: 有 n 只cat和 m 只dog,有 c 个小朋友,知道了每个小朋友喜欢的动物和不喜欢的动物, 现在可以将其中一些动物移走,如果剩下的动物中有
某个小朋友喜欢的而没有他不喜欢的,这个小朋友就会很高兴,问最多可以让多少小朋友高兴。
分析: 二分图最大独立集,如果某个小朋友和另一个小朋友有冲突即其中一个小朋友喜欢的动物是另一个小朋友讨厌的,或者他讨厌的是另一个小朋友
喜欢的话,就在两个小朋友之间连一条边,求出最大匹配, 最大独立集= 总权- 最大匹配/2(因为有重复)
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) int link[555]; int v[555]; struct node { int to,next; }e[10000000]; int tot; int head[555]; void add(int s,int u) { e[tot].to=u; e[tot].next=head[s]; head[s]=tot++; } int find(int x) { int i,k; for(i=head[x];i;i=e[i].next) { k=e[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0; } struct child { char like[5]; char dislike[5]; }ch[505]; int main() { int i,j,n,m,c; char a[3],b[3]; while(scanf("%d%d%d",&n,&m,&c)!=EOF) { tot=1; clr(head); clr(link); for(i=1;i<=c;i++) scanf("%s%s",ch[i].like,ch[i].dislike); for(i=1;i<=c;i++) for(j=1;j<=c;j++) if(strcmp(ch[i].like,ch[j].dislike)==0||strcmp(ch[i].dislike,ch[j].like)==0) add(i,j); int res=0; for(i=1;i<=c;i++) { clr(v); if(find(i)) res++; } printf("%d\n",c-res/2); } return 0; }