http://acm.hdu.edu.cn/showproblem.php?pid=2063
很长时间没有看二分图的题了,还真有点儿忘了,现在巩固一下,只贴个代码:
#include <stdio.h>
#include <string.h>
#define MAX 505
#define bool int
#define true 1
#define false 0
bool used[MAX];
int girls[MAX], boys[MAX];
bool match[MAX][MAX];
int k, a, b;
void init()
{
memset(girls, -1, sizeof(girls));
memset(boys, -1, sizeof(boys));
memset(match, false, sizeof(match));
}
bool can(int t)
{
int i;
for(i = 1; i <= b; i ++){
if(!used[i] && match[t][i]){
used[i] = true;
if(girls[i]==-1 || can(girls[i])){
boys[t] = i;
girls[i] = t;
return true;
}
}
}
return false;
}
int main()
{
int tmpa, tmpb, i, res;
while(scanf("%d", &k)&&k){
scanf("%d%d", &a, &b);
init();
while(k--){
scanf("%d%d", &tmpa, &tmpb);
match[tmpa][tmpb] = true;
}
res = 0;
for(i = 1; i <= a; i ++){
if(boys[i] == -1){
memset(used, false, sizeof(used));
if(can(i))
res ++;
}
}
printf("%d\n", res);
}
return 0;
}