http://acm.hdu.edu.cn/showproblem.php?pid=2768
#include<iostream>
using namespace std;
#define N 505
#define M 10001
struct node{
int next,v;
node(){};
node(int a,int b){
next=a;v=b;
}
}E[M*50];
int head[N],NE;
int pre[N];
bool h[N];
struct type{
char love[10];
char hate[10];
}cat[N],dog[N];
void init(){
NE=0;
memset(head,-1,sizeof(head));
memset(pre,-1,sizeof(pre));
}
void insert(int u,int v){
E[NE]=node(head[u],v);
head[u]=NE++;
}
bool dfs(int u){
for(int i=head[u];i!=-1;i=E[i].next){
int v=E[i].v;
if(!h[v]){
h[v]=1;
if(pre[v]==-1||dfs(pre[v])){
pre[v]=u;
return true;
}
}
}
return false;
}
int main(void){
int t;
scanf("%d",&t);
while(t--){
int n,m,K;
scanf("%d%d%d",&n,&m,&K);
init();
int cn=0,dn=0;
for(int i=0;i<K;i++){
char ch1[10],ch2[10];
scanf("%s%s",ch1,ch2);
if(ch1[0]=='C'){
cn++;
strcpy(cat[cn].love,ch1);
strcpy(cat[cn].hate,ch2);
}
else{
dn++;
strcpy(dog[dn].love,ch1);
strcpy(dog[dn].hate,ch2);
}
}
for(int i=1;i<=cn;i++)
for(int j=1;j<=dn;j++)
if(strcmp(cat[i].love,dog[j].hate)==0||strcmp(cat[i].hate,dog[j].love)==0)
insert(i,j);
int ans=0;
for(int i=1;i<=cn;i++){
memset(h,0,sizeof(h));
if(dfs(i))
ans++;
}
printf("%d\n",K-ans);
}
}
把喜欢和讨厌同一只猫或者狗的人建边,求出最大匹配,相减即是最大独立团