题目:
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
解题方法:
二分图最大匹配
匈牙利算法:
复杂度
实现代码
#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 <= a; i ++)
{
if(!used[i] && match[i][t]) //如果该女孩没有配对且可与该男孩配对
{
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 <= b; i ++) //由男孩为准进行匹配
{
if(boys[i] == -1) //如果未匹配
{
memset(used, false, sizeof(used)); //used是该男孩对应的所有女孩是否匹配的标志
if(can(i))
res ++;
}
}
printf("%d\n", res);
}
return 0;
}