集训队专题(6)1009 过山车
2016-02-22 14:40
344 查看
过山车
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 16130 Accepted Submission(s): 7069
Problem Description
RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
Input
输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
Output
对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
Sample Input
6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0
Sample Output
3
Author
PrincessSnow
Source
RPG专场练习赛
专题最后一题,又是一个裸的二分图题,那小编就在这里给出小编的二分图标准模板。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 500+10; int uN,vN; int g[maxn][maxn],linker[maxn]; bool used[maxn]; bool dfs(int u) { int v; for(v=1; v<=vN; v++) if(g[u][v] && !used[v]) { used[v] = true; if(linker[v]==-1 || dfs(linker[v])) { linker[v] = u; return true; } } return false; } int hungary() { int res = 0; int u; memset(linker,-1,sizeof(linker)); for(u=1; u<=uN; u++) { memset(used,0,sizeof(used)); if(dfs(u)) res++; } return res; } int main() { int k,u,v; while(scanf("%d",&k)&&k) { scanf("%d%d",&uN,&vN); memset(g,0,sizeof(g)); for(int i=0; i<k; i++) { scanf("%d%d",&u,&v); g[u][v] = 1; } int ans = hungary(); printf("%d\n",ans); } return 0; }
相关文章推荐
- 蓝桥杯 操作格子 (线段树)
- jsp登录页面捕获enter键,实现登录操作
- 关于Layer的问题
- 1. Smalidea无源码调试android应用
- 当自己写http服务的时候,路由是很重要的,我这里分享我在路由使用的时候是如何注册的
- jquery和js 学习(推荐比较好的网站)
- Gimp去除图片背景色方法
- java.util.ServiceLoader源码分析
- 利用内存映射文件处理大文件
- redis 4000
- 【SPOJ-MYQ5】The Nerd Factor【计数DP】
- Ios开发,图片上传
- 低位优先的字符串排序
- ps切图(8)——精准切图
- struts2的ActionSupport里面有execute
- ubuntu软件安装三 xampp phpstorm
- iOS 对数字小数进行进位和舍去的处理
- 一:java传统线程创建
- 关于Block代码块的使用
- 邮件中继成畅邮标配 U-Mail为何领先