杭电 hdu 2063 (最基础的 二分匹配)

来源:互联网 发布:arksz410788k数据手册 编辑:程序博客网 时间:2024/04/30 10:37


杭电 hdu 2063 (最基础的   二分匹配)


过山车

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13630    Accepted Submission(s): 5977


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 31 11 21 32 12 33 10
 

Sample Output
3
 

Author
PrincessSnow
 

Source
RPG专场练习赛
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  2444 1281 3360 1045 2065 
 





题意:这就是最基础的二分匹配,一起做过上车,然后女生提出条件,计算最大的组队数


题解:二分匹配,算最大匹配数,其实也是dfs,遍历,通过第一个人的匹配,然后要是第二个人选中了第一个人的搭档,要是第一个人还有其他选中就将搭档让个第二个人
,接着就不断匹配。
还是看着代码来讲解好了




#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <algorithm>#include <iostream>using namespace std;const int maxn = 505;int map[maxn][maxn];              //记录是否可以匹配,0表示不能,1表示能int vis[maxn];                  //用在不同队伍匹配是的标记作用int pri[maxn];                     //记录哪个男的被特定的女生抢走int n, m;bool find (int x)                   //遍历{    int i;    for (i = 1; i <= n; i++)         //男生的遍历    {        if (!vis[i] && map[x][i])        //判断这个男生和特定女生可以匹配, vis[]是用来标记的,表示暂时被x女生选中        {            vis[i] = 1;            if (pri[i] == -1 || find(pri[i]))       //要么表示这个男的第一次被选,要是选中这个男的的女生有其他选择            {                pri[i] = x;                return true;            }        }    }    return false;}int main (){    int k, i, a, b, ans;    while (scanf ("%d", &k) != EOF)    {        ans = 0;        if (k == 0)            return 0;        scanf ("%d%d", &m, &n);        memset (map, 0, sizeof (map));        memset (pri, -1, sizeof (pri));        for (i = 0; i < k; i++)        {            scanf ("%d%d", &a, &b);            map[a][b] = 1;                //将可以匹配的赋值为1        }        for (i = 1; i <= m; i++)        {            memset (vis, 0, sizeof (vis));      //每次遍历都要进行赋初值            if (find (i))                ans++;                 //最大匹配数        }        printf ("%d\n", ans);    }    return 0;}


0 0