http://acm.hdu.edu.cn/showproblem.php?pid=2063
题意:有m个男,n个女,和 k 条边,求有多少对男女可以搭配。
思路:裸的二分图最大匹配,匈牙利算法。
枚举每一个男生,然后对其DFS,在DFS中枚举女生,如果有边相连的话,如果这个女生还没有搭档(match == -1),那么这个女生的搭档就是当前的男生,否则继续DFS这个女生的搭档,看看能不能让这个女生本来的搭档和其他女生搭配,从而给当前的男生腾出位置。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <iostream>
#include <stack>
#include <map>
#include <queue>
using namespace std;
#define N 1010
#define INF 0x3f3f3f3f int match[N];
int mp[N][N];
bool vis[N];
int n, m; bool dfs(int u)
{
for(int i = ; i <= m; i++) {
if(mp[u][i] && !vis[i]) {
vis[i] = ;
if(match[i] == - || dfs(match[i])) {
match[i] = u;
return true;
}
}
}
return false;
} int main()
{
int k;
while(scanf("%d", &k), k) {
scanf("%d%d", &m, &n);
memset(mp, , sizeof(mp));
for(int i = ; i <= k; i++) {
int u, v;
scanf("%d%d", &u, &v);
mp[v][u] = ;
}
int ans = ;
memset(match, -, sizeof(match));
for(int i = ; i <= n; i++) {
memset(vis, , sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n", ans);
}
return ;
}