HDU 2063 过山车 第一道最大二分匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2063
题目大意:
m个女生和n个男生一起做过山车,每一排必须一男一女,而每个女孩愿意和一些男生坐一起,, 你要找出一个最大匹配,使得最多的人坐上过山车。
思路:
第一道二分匹配。在同学blog上看到的题。
学习了匈牙利算法。课上有讲过,不过那时我在干啥?没弄太明白,现在懂了哈哈。
http://kukumayas.iteye.com/blog/1075610
#include<cstdio> #include<cstring> const int MAXN=1000+10; int head[MAXN],len,res[MAXN]; bool vis[MAXN]; struct edge { int to,next; }e[MAXN]; void add(int from,int to) { e[len].to=to; e[len].next=head[from]; head[from]=len++; } bool find(int a) { for(int i=head[a];i!=-1;i=e[i].next) { int id=e[i].to; if(!vis[id]) { vis[id]=true; if(res[id]==0 || find(res[id])) { res[id]=a; return true; } } } return false; } int main() { int k,n,m; while(scanf("%d",&k),k) { scanf("%d%d",&m,&n); memset(head,-1,sizeof(head)); len=0; memset(res,0,sizeof(res)); for(int i=0;i<k;i++) { int from,to; scanf("%d%d",&from,&to); add(from,to); } int ans=0; for(int i=1;i<=m;i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } printf("%d\n",ans); } return 0; }
新 blog : www.hrwhisper.me