zoukankan      html  css  js  c++  java
  • hdu2063 最大二分匹配(匈牙利算法)

    过山车

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


    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
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int N=505;
    int line[N][N];
    int girl[N],used[N];
    int k,m,n;
    bool found(int x)
    {
        for(int i=1; i<=n; i++)
        {
            if(line[x][i]&&!used[i])//x与i之间是否有连线,并且男生i没有被匹配过(第一个女生与她联系的第一个男生配对)
            {
                used[i]=1;//标记男生i被匹配过
                if(girl[i]==0||found(girl[i]))//第i个女生还没有匹配或者第I个女生匹配了就回溯
                {//先让I女生和X男匹配,再让I-1女生和与她联系的第二个男生匹配
                    girl[i]=x;
                    return 1;
                }
            }
        }
        return 0;
    }
    int main()
    {
        int x,y;
        while(scanf("%d",&k)&&k)
        {
            scanf("%d %d",&m,&n);
            memset(line,0,sizeof(line));
            memset(girl,0,sizeof(girl));
            for(int i=0; i<k; i++)
            {
                scanf("%d %d",&x,&y);
                line[x][y]=1;
            }
            int sum=0;
            for(int i=1; i<=m; i++)
            {
                memset(used,0,sizeof(used));
                if(found(i))
                 sum++;
            }
            printf("%d
    ",sum);
        }
        return 0;
    }

     相似题目:

         E: DATE ALIVE

    Time Limit: 1 s      Memory Limit: 128 MB     
     

    Problem Description

    五河士道家里的精灵越来越多了,而每一个精灵都想和他有一个约会。然而五河士道却只有一个,无奈之下只能使出分身帮自己解围。

    不过并不是所有的精灵都同意这样做,有些精灵不愿意和士道分身进行约会,也有部分精灵同时选择同一个分身进行约会。

    假设有N个分身,精灵的数量为M,可能的约会组合有K组。

    设N=3,M=5,K=5,可能的组合为1-1,1-3,2-4,3-4,3-5(如下图),为了避免冲突,我们最多可以选择1-1,2-4,3-5一共三种组合(或者是1-3,2-4,3-5)

    那么请设计一个程序判断每一次可能的组队最多能确定多少队伍?最后,让我们的约会开始吧~

    Input

    输入N,M,K

    N,M,K为正整数

    1<=N<=500

    1<=M<=500

    接下来K行,输入u,v,表示uv之间愿意组队

    u在N的范围内,v在M的范围内

    Output

    输出最大组队数目

    Sample Input

    3 5 5
    1 1
    1 3
    2 4
    3 4
    3 5
    

    Sample Output

    3
  • 相关阅读:
    [Selenium+Java] Upload Selenium Script to GitHub
    [Selenium+Java] Apache ANT with Selenium: Complete Tutorial
    [Selenium+Java] Selenium Core Extensions (User-Extensions.js)
    序列流、对象操作流、打印流、标准输入输出流、随机访问流、数据输入输出流、Properties(二十二)
    FileReader、 FileWriter、readLine()和newLine()、LineNumberReader(二十一)
    图片加密解密小知识
    道德经--老子
    IO、FileInputStream、(二十)
    异常、Throwable、finally、File类(十九)
    Collections工具类、Map集合、HashMap、Hashtable(十八)
  • 原文地址:https://www.cnblogs.com/-citywall123/p/10034516.html
Copyright © 2011-2022 走看看