题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2063
题目大意:
M个男生,N个女生,男生和女生组合一对过山车,有K种“可”组合对,问可以过山车的最多对数。
参考:
http://kukumayas.iteye.com/blog/1075610(这位仁兄配合图解,解释得很详细)
http://baike.baidu.com/view/501092.htm(百度百科)
心得:
这题要是没找资料,自己想到死都想不出来,压根就没听过这算法,整合已有资源也是种学习。不过,代码要自己敲。
代码:
#include<stdio.h>
#include<string.h>
int data[505][505];//标记是否可匹配
int result[505];//与之匹配的点
int flag[505];//标记是否搜索过
int ans;
int K,M,N;
void init()
{
ans=0;
memset(data,0,sizeof(data));
memset(result,0,sizeof(result));
int v1,v2;
for(int i=1;i<=K;i++)
{
scanf("%d%d",&v1,&v2);
data[v1][v2]=1;
}
return;
}
int find(int a)
{
for(int i=1;i<=N;i++)
{
if(data[a][i]==1&&flag[i]==0)//如果a与i点相邻,且i点未被查找过。
{
flag[i]=1;
if(result[i]==0||find(result[i]))//i未在匹配中或者i在匹配中但从与i相邻的节点出发可以有增广路
{
result[i]=a;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&K),K)
{
scanf("%d%d",&M,&N);
init();
for(int i=1;i<=M;i++)
{
memset(flag,0,sizeof(flag));
if(find(i)) ans++;
}
printf("%d\n",ans);
}
return 0;
}