传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2063
#include<stdio.h>
#include<string.h>
#define MAX 600
int pos[MAX][MAX],match[MAX],dian[MAX];
main()
{
int a,b,M,N,K,i,count;
while(scanf("%d",&K)!=EOF && K!=0)
{
count=0;
scanf("%d %d",&M,&N);
memset(pos,0,sizeof(pos)); //将所有元素置零,pos[i][j]=1表示女生i与男生j可匹配
memset(match,0,sizeof(match)); //match[i]=j表示男生i与女生j已经匹配
memset(dian,0,sizeof(dian)); //dian[i]=1表示该点已经被访问过。
for(i=0;i<K;i++)
{
scanf("%d %d",&a,&b);
pos[a][b]=1;
}
for(i=1;i<=M;i++) //①对每个女生(接下①)
{
memset(dian,0,sizeof(dian)); //已访问点重置
if(find(i,N)!=0) count++;
}
printf("%d\n",count);
}
}
int find(int start,int N)
{
int i;
for(i=1;i<=N;i++) //①遍历所有男生
{
if(pos[start][i]==1 && dian[i]==0) // 如果双方有匹配意愿,且该点未访问,访问该点
{
dian[i]=1;
if(match[i]==0 || find(match[i],N)!=0) //如果男方i目前未匹配 或者 已经匹配,但是能重新给j(match[i]=j)女生分配i男生以外的男生,因为此时dian【i】=1,所以不会再次匹配j与i。
{
match[i]=start; //则匹配i男生与start女生,j女生此时与另外一男匹配
return 1; //匹配成功返回 1
}
}
}
return 0; // 匹配失败返回0
}