(没有账号,在别处交的) 我发现我写的这种匈牙利算法和本题题解(另一篇)的不一样,但是都能过板子
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=700;
int N,k1,k2,N1,vis[maxn],p[maxn],head[maxn],nume=0,cnt=0,lk[maxn][2],uk[maxn][2],e1[maxn];//animal num
struct node{int to,nxt;}e[maxn*maxn];
int qd(){
int rt=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while('0'<=c&&c<='9') rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
return rt;
}
char gc(){
char c=getchar();
while(c!='C'&&c!='D') c=getchar();
return c;
}
void edgen(int from,int to){
e[++nume].nxt=head[from];
head[from]=nume;
e[nume].to=to;
}
void dfs1(int u,int c){
vis[u]=1;
if(c) e1[++N1]=u;
// if(c) printf("get %d\n",u);
for(int i=head[u];i;i=e[i].nxt){
if(!vis[e[i].to]) dfs1(e[i].to,c^1);
}
}
bool dfs(int u,int from){
if(vis[u]==from) return 0;
vis[u]=from;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!p[v]||dfs(vis[p[v]],from)){p[v]=u;return 1;}
}
return 0;
}
int main(){
k1=qd(),k2=qd(),N=qd();
for(int i=1;i<=N;i++){
char c=gc();int x=qd(),y=qd();
if(c=='C') lk[i][0]=0,lk[i][1]=x,uk[i][0]=1,uk[i][1]=y;
else lk[i][0]=1,lk[i][1]=x,uk[i][0]=0,uk[i][1]=y;
}
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i==j) continue;
if(lk[i][0]==uk[j][0]&&lk[i][1]==uk[j][1]) edgen(i,j),edgen(j,i);
}
}
for(int i=1;i<=N;i++) if(!vis[i]) dfs1(i,1);
memset(vis,0,sizeof(vis));
for(int i=1;i<=N1;i++) if(dfs(e1[i],e1[i])) cnt++;
printf("%d\n",N-cnt);
return 0;
}