题目描述:已知有n个男生和m个女生,他们各自有各自喜欢的人,求如何分配才能让匹配的对数最多
思路:这道题其实就是一道关于匈牙利算法的题,先将所有的男生扫一遍,尽可能的给每一个男生找到一个配对的女生,如果找的到就将他们两匹配,如果找不到,就断开先前已经匹配好的一队,再判断当前的这个男生能否找到一个与之匹配的女生。如果找的到就将他们两个匹配,如果找不到就放弃当前的男生
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n,m,K,a,b;
int used[510],boy[510],line[510][510];
int find(int x)
{
for(int i=1;i<=m;i++)
{
if(line[x][i]==1&&used[i]==0)
{
used[i]=1;
if(boy[i]==0||find(boy[i]))
{
boy[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&K)!=EOF&&K)
{
memset(used,0,sizeof(used));
memset(line,0,sizeof(line));
memset(boy,0,sizeof(boy));
scanf("%d%d",&n,&m);
for(int i=0;i<K;i++)
{
scanf("%d%d",&a,&b);
line[a][b]=1;
}
int sum=0;
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof(used));
if(find(i))
sum++;
}
printf("%d\n",sum);
}
return 0;
}