• 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

    匈牙利算法模板题,(就算是我的第一个二分图吧。。)

    #include <cstdio>
    #include <cstring> 
    using namespace std;
    int k,m,n,tot,v[1005],first[1005],nxt[1005*1005*2],girl[1005],ans=0;
    bool vis[1005];
    bool dfs(int x)
    {
        for(int i=first[x];~i;i=nxt[i])
            if(!vis[v[i]]){
                vis[v[i]]=1;
                if(!girl[v[i]]||dfs(girl[v[i]])){
                    girl[v[i]]=x;return true;
                }
            }
        return false;
    }
    int main()
    {
        while(scanf("%d",&k)&&k)
        {
            scanf("%d%d",&m,&n);
            memset(first,-1,sizeof(first));
            memset(girl,0,sizeof(girl));
            tot=ans=0;
            register int xx;
            for(int i=1;i<=k;i++){
                scanf("%d%d",&xx,&v[tot]);
                nxt[tot]=first[xx],first[xx]=tot++;
            }
            for(int i=1;i<=m;i++){
                memset(vis,0,sizeof(vis));
                if(dfs(i))ans++;
            }
            printf("%d
    ",ans);
        }
    }

    这里写图片描述

  • 相关阅读:
    Python基础之初始编码
    Excel图表编辑---表格移动,样式修改
    Python基础之Python的变量、常量
    刷题62. Unique Paths
    刷题56. Merge Intervals
    刷题55. Jump Game
    刷题53. Maximum Subarray
    刷题49. Group Anagrams
    刷题48. Rotate Image
    刷题46. Permutations
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532479.html
Copyright © 2020-2023  润新知