本文主要是介绍HDU 2063 过山车(最大二分匹配),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目: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;
}
这篇关于HDU 2063 过山车(最大二分匹配)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!