大意:当一个人喜欢的留下来,而不喜欢的移走时,他会很高兴。
想法:喜欢猫的是一个集合,喜欢狗的是另一个集合。当其中一个人喜欢的,和另外一个人不喜欢的一样时,就可以形成一个匹配,求出最大匹配。
最大独立集=节点数-最大匹配。
#include"stdio.h" #include"string.h" #define N 501 struct node { char hate[5],like[5]; }cat[N],dog[N]; int map[N][N],v[N],link[N]; int C,D,n,m,t; int dfs(int k) { int i; for(i=0;i<D;i++) { if(map[k][i]&&!v[i]) { v[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=k; return 1; } } } return 0; } int main() { int T,i,j,ans; char s[N],ss[N]; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&t); C=D=0; for(i=0;i<t;i++) { scanf("%s %s",s,ss); if(s[0]=='C') { strcpy(cat[C].like,s); strcpy(cat[C].hate,ss); C++; } else { strcpy(dog[D].like,s); strcpy(dog[D].hate,ss); D++; } } memset(map,0,sizeof(map)); for(i=0;i<C;i++) { for(j=0;j<D;j++) { if(strcmp(cat[i].hate,dog[j].like)==0||strcmp(cat[i].like,dog[j].hate)==0) map[i][j]=1; } } memset(link,-1,sizeof(link)); ans=0; for(i=0;i<C;i++) { memset(v,0,sizeof(v)); if(dfs(i)) ans++; } printf("%d\n",t-ans); } return 0; }