原题:
http://acm.hdu.edu.cn/showproblem.php?pid=2063
//hdu 2063
#include<stdio.h>
#include<memory.h>
int a[1001][1001];
int usey[501];
int pair[501];
int t;//配对数量
int m,n;//m为女生数量,n为男生数量
bool find(int x) //为这个x女生找搭档
{
for(int i=1;i<=n;i++)
{
//扫描每一个男生
if(a[x][i]==1 && usey[i]==0 )
{
usey[i]=1;
if(pair[i]==0 || find(pair[i]))
{
pair[i]=x;
return true;
}
}
}
return false;
}
int main()
{
//二分最大匹配数量问题,匈牙利算法
scanf("%d",&t);
while(t!=0)
{
scanf("%d %d",&m,&n);
//初始化
memset(a,0,sizeof(a)); //0 表示女生对男生都没有做partner倾向
memset(pair,0,sizeof(pair)); //0 表示每一个男生都还未匹配
int b,c;
int ans=0;
for(int i=1;i<=t;i++)
{
scanf("%d %d",&b,&c);
a[b][c]=1; //表示b对c有做partner的倾向
}
for(int i=1;i<=m;i++)//为每一个女生找搭档
{
memset(usey,0,sizeof(usey));
if(find(i)){
ans++;
}
}
printf("%d\n",ans);
scanf("%d",&t);
}
return 0;
}
6万+

被折叠的 条评论
为什么被折叠?



