一个简单的二分图匹配
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2200;
vector<int>edge[maxn];
void init(int n){
for(int i=0;i<=n;i++){
edge[i].clear();
}
}
int mat[maxn];
bool vis[maxn];
bool dfs(int st){
vis[st] = true;
for(auto &x:edge[st]){
if(!vis[x]){
vis[x] = true;
if(mat[x]==-1 || dfs(mat[x])){
mat[x] = st,mat[st] = x;
return true;
}
}
}
return false;
}
int cal(int n){
memset(mat,-1,sizeof(mat));
int cnt = 0;
for(int i=1;i<=n;i++){
if(mat[i] == -1){
memset(vis,0,sizeof(vis));
if(dfs(i))
cnt++;
}
}
return cnt;
}
int main(){
int k,m,n;
while(~scanf("%d",&k) && k){
scanf("%d %d",&n,&m);
init(m+n);
int u,v;
while(k--){
scanf("%d %d",&u,&v);
v += n;
edge[u].push_back(v);
edge[v].push_back(u);
}
printf("%d\n",cal(n+m));
}
return 0;
}