HDU 2063 过山车(最大二分匹配)

来源:互联网 发布:淘宝店如何关闭 编辑:程序博客网 时间:2024/05/21 19:29
题目:

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;}




0 0