![](https://i-blog.csdnimg.cn/blog_migrate/ac240c15eb36bb053c4838fb02036efa.png)
#include <iostream>
#include <stdio.h>
using namespace std;
bool find(int);
bool combine[501][501];
bool mark[501]; // 当前女生选择的这一轮中,男生有没有被选中过
int boy[501]; // 存储每个男生所组合的女生编号
int M, N; // 依次为女生人数和男生人数
int main() {
int K, i, count;
int Ai, Bj;
while (cin >> K) {
if (!K) {
break;
}
cin >> M >> N;
// 初始化“组合数组”
for (i = 1; i < 501; i++) {
memset(combine[i], 0, sizeof(combine[i]));
}
// 初始化“配对标号”数组
memset(boy, 0, sizeof(boy));
count = 0;
for (i = 0; i < K; i++) {
cin >> Ai >> Bj;
combine[Ai][Bj] = 1;
}
for (i = 1; i <= M; i++) {
// 每一轮都要初始化标记数组
memset(mark, 0, sizeof(mark));
if (find(i)) {
count++;
}
}
printf("%d\n", count);
}
return 0;
}
bool find(int n) {
int i;
for (i = 1; i <= N; i++) {
if (combine[n][i] && !mark[i]) {
mark[i] = true;
// 情况一:如果该男生还没有匹配到女生
// 情况二:匹配到该男生的女生可以分配到另一个没有匹配的男生
if (boy[i] == 0 || find(boy[i])) {
boy[i] = n;
return true;
}
}
}
return false;
}