过山车

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 11520    Accepted Submission(s): 5072
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

第一道二分匹配题。

纯属模板。

參考:http://blog.csdn.net/wellerzhao/article/details/7756956

代码1:

#include <stdio.h>
#include <string.h>
#define M 555 int map[M][M];
int mx[M], my[M];
int vis[M];
int n, m; int find(int s){
int i;
for(i = 1; i<= m; i ++){
if(!vis[i]&&map[s][i]){
vis[i] = 1;
if(my[i] == 0||find(my[i])){
my[i] = s;
mx[s] = i;
return 1;
}
}
}
return 0;
} void f(){
for(int i = 1; i <= n; i ++)
printf("%d..%d,,%d..%d\n", i, mx[i], i, my[i]);
}
int main(){
int k;
while(scanf("%d", &k), k){
int i;
memset(map, 0, sizeof(map));
memset(mx, 0, sizeof(mx));
memset(my, 0, sizeof(my));
int a, b;
scanf("%d%d", &n, &m);
for(i = 0; i < k; i ++){
scanf("%d%d", &a, &b);
map[a][b] = 1;
}
int ans = 0;
for(i = 1; i<= n; i ++){
if(!mx[i]){
memset(vis, 0, sizeof(vis));
if(find(i)) ++ans;
}
}
printf("%d\n", ans);
// f();
}
return 0;
}

以下的代码是另外的一种形式,,只是仅仅是多了个数组。

。。

思想还是一样的

代码;

#include <stdio.h>
#include <string.h>
#define M 555 int map[M][M];
int mx[M], my[M];
int vis[M];
int n, m; int find(int s){
int i;
for(i = 1; i<= m; i ++){
if(!vis[i]&&map[s][i]){
vis[i] = 1;
if(my[i] == 0||find(my[i])){
my[i] = s;
mx[s] = i;
return 1;
}
}
}
return 0;
} void f(){
for(int i = 1; i <= n; i ++)
printf("%d..%d,,%d..%d\n", i, mx[i], i, my[i]);
}
int main(){
int k;
while(scanf("%d", &k), k){
int i;
memset(map, 0, sizeof(map));
memset(mx, 0, sizeof(mx));
memset(my, 0, sizeof(my));
int a, b;
scanf("%d%d", &n, &m);
for(i = 0; i < k; i ++){
scanf("%d%d", &a, &b);
map[a][b] = 1;
}
int ans = 0;
for(i = 1; i<= n; i ++){
if(!mx[i]){
memset(vis, 0, sizeof(vis));
if(find(i)) ++ans;
}
}
printf("%d\n", ans);
// f();
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

hdoj 2063 过山车 【双边匹配匈牙利算法】的更多相关文章

  1. hdu 2063 过山车 二分匹配(匈牙利算法)

    简单题hdu2063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Ot ...

  2. hdoj 2063 过山车【匈牙利算法+邻接矩阵or邻接表】

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. HDU 2063 过山车 二分匹配

    解题报告:有m个女生和n个男生要结成伴坐过山车,每个女生都有几个自己想选择的男生,然后要你确定最多能组成多少对组合. 最裸的一个二分匹配,这是我第一次写二分匹配,给我最大的感受就是看那些人讲的匈牙利算 ...

  4. HDU 2063 过山车(二分图 && 匈牙利 && 最小点覆盖)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 这是一道很经典的匈牙利问题: 把男同学看成左边点,女同学看成右边点,如果两个同学愿意同 ...

  5. HDU 2063 过山车(二分匹配入门)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配最大匹配数简单题,匈牙利算法.学习二分匹配传送门:http://blog.csdn.ne ...

  6. HDOJ 2063 过山车

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. hdu 2063 过山车(匈牙利算法模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  8. hdu 2063 过山车(模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  9. HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

    Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

随机推荐

  1. [欧拉] poj 2513 Colored Sticks

    主题链接: http://poj.org/problem? id=2513 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Tota ...

  2. cocos2d-x2.x环境搭建配置

    [安装工具] VS2012 Cocos2D-X 2.2.3 Python 2.7.8 一.运行cocos2dx中的hello world! 1.在Cocos2D-X 2.2.3目录下,点击cocos2 ...

  3. C++传递函数指针

    函数指针是一个很好的类型.因此,您可以编写一个函数,它的一个参数是一个函数指针.然后.在(外部)当函数使用的函数指针参数,来间接调用时调用相应的参数的函数的函数. 因为指针在不同的情况下能够指向不同的 ...

  4. UML序列图总结(转)

    序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线 ...

  5. Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils

    1.错误叙述性说明 2014-7-10 23:12:23 org.apache.catalina.core.StandardContext filterStart 严重: Exception star ...

  6. C++ 版本的split_string

    vector<string> split_string(const string &in, char del, bool skip_empty) { vector<strin ...

  7. java编程中容易犯2的细节汇总

    1.for() 和 while() 执行步骤 for(s1;s2;s3){ s4;} 1.进入循环执行s1;       2.执行s2;//条件为真才执行s4,不然就跳出for了.      3,执行 ...

  8. cocos2dx 遮罩层 android 手机上 失败

    1.CCClippingNode使用(在模拟器上ok,在手机上不行),实现多个剪切区域 local layer=CCLayerColor:create(ccc4(0,0,0,110))     --/ ...

  9. MATLAB描绘极坐标图像——polar

    polar可用于描绘极坐标图像. 最简单而经常使用的命令格式:POLAR(THETA, RHO)  当中,THETA是用弧度制表示的角度,RHO是相应的半径. 例: a=-2*pi:.001:2*pi ...

  10. 设置函数环境——setfenv(转)

    当我们在全局环境中定义变量时经常会有命名冲突,尤其是在使用一些库的时候,变量声明可能会发生覆盖,这时候就需要一个非全局的环境来解决这问题.setfenv函数可以满足我们的需求. setfenv(f, ...