HDU 2063 过山车(二分图最大匹配:简单题)
http://acm.hdu.edu.cn/showproblem.php?pid=2063
题意:
有N个女孩和M个男孩配对坐过山车,每个女孩有多种可能的选择. 但是最终每个女孩只能与一个男孩配对(男孩也只能配对一个女孩).问你最多能配出多少对男孩女孩?
分析:
明显的二分图最大匹配问题.左边放女孩,右边放男孩.如果i女孩能与j男孩配对,那么左i与右j有一条无向边.
输出新图的最大匹配数即可.
AC代码:
#include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=500+10; struct Max_Match { int n,m; vector<int> g[maxn]; bool vis[maxn]; int left[maxn]; void init(int n,int m) { this->n=n; this->m=m; for(int i=1;i<=n;i++) g[i].clear(); memset(left,-1,sizeof(left)); } bool match(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(!vis[v]) { vis[v]=true; if(left[v]==-1 || match(left[v])) { left[v]=u; return true; } } } return false; } int solve() { int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(match(i)) ans++; } return ans; } }MM; int main() { int k,n,m; while(scanf("%d",&k)==1 && k) { scanf("%d%d",&n,&m); MM.init(n,m); while(k--) { int u,v; scanf("%d%d",&u,&v); MM.g[u].push_back(v); } printf("%d\n",MM.solve()); } return 0; }