思路:二分图匹配
匈牙利算法(个人理解最优匹配):每次查询都尽可能匹配,如果这个点的对象已经被匹配了,那就递归拆边,递归这个过程保证拆后的点都能匹配才能够回溯,否则不匹配,开始下一个点。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define max_n 510
using namespace std;
int mapp[max_n][max_n];
int used[max_n], girl[max_n];
int p1, p2, n, m, k;
bool dfs(int x) {
for(int i = 1; i<= m; i++) {
if(mapp[x][i] && !used[i]) {
used[i] = 1;
if(!girl[i] || dfs(girl[i])) {
girl[i] = x;
return 1;
}
}
}
return 0;
}
int main() {
while(scanf("%d", &k) && k) {
memset(mapp, 0, sizeof(mapp));
memset(girl, 0, sizeof(girl)); //表示汉子对应的妹子编号
scanf("%d %d", &n, &m);
for(int i = 0; i < k; i++) {
scanf("%d %d", &p1, &p2);
mapp[p1][p2] = 1;
}
int ans = 0;
for(int i = 1; i <= n; i++) {
memset(used, 0, sizeof(used));
if(dfs(i)) ans++;
}
printf("%d\n", ans);
}
return 0;
}