题目: http://acm.hdu.edu.cn/showproblem.php?pid=2063
借的大佬的代码,可以当作模板~~~~~~
//此题是求最大匹配数,用匈牙利算法
#include<stdio.h>
#include<string.h>
int line[505][505],boy[505],flag[505]; //line表示两人是否有关系,boy表示该男生的女伴,flag表示该男生是否被询问过
int n,m; //m为女生数量,n为男生数量
int find(int x) //为任意一个女生寻找最佳伴侣,找到则返回1
{
for(int k=1;k<=n;k++) //逐个扫描每个男生
if(line[x][k]==1&&flag[k]==0) //若两人之间有关系且在这次查找中没有被询问
{
flag[k]=1; //标志该男生在此次查找中已被询问
if(boy[k]==0||find(boy[k])) //如果该男生没有女伴或者该男生的女伴可以找到其他男生,则匹配成功,这是一个递归过程
{
boy[k]=x; //符合条件则将该女生和该男生匹配上,并标记
return 1;
}
}
return 0;
}
int main()
{
int k;
int i,a,b;
while(scanf("%d",&k)!=EOF&&k)
{
scanf("%d%d",&m,&n);
int count=0;
memset(line,0,sizeof(line));
memset(boy,0,sizeof(boy));
for(i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
line[a][b]=1; //表示女生a和男生b有关系
}
for(i=1;i<=m;i++) //逐个扫描每个女生,为她们寻找最佳伴侣
{
memset(flag,0,sizeof(flag)); //每次循环将标志都清零
if(find(i)) //如果找到,则最大匹配数加1
count++;
}
printf("%d\n",count);
}
return 0;
}