过山车 HDU 2063 (二分图匹配裸题)

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

DFS算法

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define MAXN 510
 5 using namespace std;
 6 int n,m,k;///x,y集合中点的个数
 7 int maps[MAXN][MAXN];///邻接矩阵
 8 int cx[MAXN];///匹配关系,cx[1]=2表示男1和女2约会
 9 int cy[MAXN];
10 int vis[MAXN];///顶点访问状态数组,1访问过,0未访问过
11 int path(int x)///x为任何一个女生
12 {
13     int i;
14     for(i=1; i<=n; i++)///i为男生
15     {
16         if(maps[x][i]&&!vis[i])
17         {
18             vis[i]=1;
19             if(!cx[i]||path(cx[i]))
20             {
21                 cx[i]=x;
22                 cy[x]=i;
23                 return 1;
24             }
25         }
26     }
27     return 0;
28 }
29 int MaxMatch()
30 {
31     int res=0;
32     int i;
33     memset(cy,0,sizeof(cy));
34     memset(cx,0,sizeof(cx));///初始化为0
35     for(i=1; i<=m; i++)
36     {
37         memset(vis,0,sizeof(vis));
38         if(path(i))
39         {
40             res++;
41         }
42     }
43     return res;
44 }
45 int main()
46 {
47     int i;
48     int a,b;
49     while(scanf("%d",&k)!=EOF)
50     {
51         if(k==0)
52         {
53             break;
54         }
55         scanf("%d%d",&m,&n);
56         memset(maps,0,sizeof(maps));
57         for(i=0; i<k; i++)
58         {
59             scanf("%d%d",&a,&b);
60             maps[a][b]=1;
61         }
62         printf("%d\n",MaxMatch());
63     }
64     return 0;
65 }

原文地址:https://www.cnblogs.com/wkfvawl/p/9839325.html

时间: 2024-11-02 02:12:59

过山车 HDU 2063 (二分图匹配裸题)的相关文章

hdu 2063 二分图匹配

题意:一些女的和一些男的有好感,有好感的能一起坐过山车,问最多能组成多少对 hdu 11 页上少有的算法题,二分图匹配问题,匈牙利算法,对于每一个汉子,看和他有好感的妹子有没有配对了,没有配对过就可以成功配对,若已经配对过了,就看那个妹子所配对的汉子能不能再找个没有配对的妹子,如果可以就拆散当前配对重组配对,否则就不能拆:如果找完所有有好感的妹子仍然没能配对成功,那这个汉子就注定孤独一生了``` 1 #include<stdio.h> 2 #include<string.h> 3

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro

HDU 2063 过山车(第一发二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow

hdu 1281 二分图匹配

题目:在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下.但是某些格子若不放子,就 无法保证放尽量多的“车”,这样的格子被称做重要点.Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么? 二分图匹配居然还能这么用!!!脑洞大开啊!!! 思路:把棋盘的行x看成二分图左边的点,列y看成二分图右边的点,那么就把可以放车的位置看成是一条边,而二分图的最大匹配中x互不相同,y 互不相同,所以每个匹配都是不同行不同列,所以最大

hdu 2063 匈牙利算法模板题

题意:有x个男生各自有喜欢的女生,y个女生各自有喜欢的男生.互相喜欢的在一起有好感度.问怎样好感度最高. 题解:匈牙利算法裸题. 代码: #include <cstdio>#include <cstring>#define N 1500int Map[N][N],M[N],vis[N];int k,m,n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(Map[u][i]&&!vis[i]){     

hdu 4185 二分图匹配

题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 ...... .##... .##... ....#. ....## ...... Sample Output Case 1: 3 1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=1000; 4 char map[610][6

Land of Farms HDU - 5556 二分图匹配

Farmer John and his brothers have found a new land. They are so excited and decide to build new farms on the land. The land is a rectangle and consists of N×MN×Mgrids. A farm consists of one or more connected grids. Two grids are adjacent if they sha

hdu2063 过山车(最大二分匹配)

强烈推荐的匈牙利算法介绍:http://www.renfei.org/blog/bipartite-matching.html 1 #include "iostream" 2 #include "vector" 3 #include "memory.h" 4 using namespace std; 5 #define swap(a,b,t) ( (t) = (x),(x) = (y),(y) = (t) ) 6 #define MAXN 101

Girls and Boys HDU - 1068 二分图匹配(匈牙利)+最大独立集证明

最大独立集证明参考:https://blog.csdn.net/qq_34564984/article/details/52778763 最大独立集证明: 上图,我们用两个红色的点覆盖了所有边.我们证明的前提条件是已经达到最小覆盖. 即条件1.已经覆盖所有边,条件2.所用的点数最小 首先我们来证明蓝色点组成的是一个独立集:如果有两个蓝色点间有边相连,那么这条 边则没有被覆盖,则与条件1矛盾.因此是独立集. 再来证明这个独立集最大: 如果我们要再增加这个独立集中的点,则需要把某个红点变 成蓝点.而