• (二分匹配 模板)过山车 -- hdu --2063


    链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=2063

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=86797#problem/A

    过山车

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


    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 <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    using namespace std;
    
    #define N 550
    
    int n, m;
    int vis[N], used[N], G[N][N];
    
    bool Find(int u)
    {
        for(int i=1; i<=m; i++)
        {
            if(!vis[i] && G[u][i])
            {
                vis[i] = 1;
                if(!used[i] || Find(used[i]))
                {
                    used[i] = u;
                    return true;
                }
            }
        }
        return false;
    }
    
    
    int main()
    {
        int k;
        while(scanf("%d", &k), k)
        {
            int i, u, v;
    
            memset(used, 0, sizeof(used));
            memset(G, 0, sizeof(G));
    
            scanf("%d%d", &n, &m);
            for(i=1; i<=k; i++)
            {
                scanf("%d%d", &u, &v);
                G[u][v] = 1;
            }
    
            int ans=0;
    
            for(i=1; i<=n; i++)
            {
                memset(vis, 0, sizeof(vis));
                if(Find(i))
                    ans++;
            }
            printf("%d
    ", ans);
        }
        return 0;
    }

    上个星期学的,说来惭愧还没写题呢!一定会好好学的!

    勿忘初心
  • 相关阅读:
    Linq分组后,再对分组后的每组数据进行排序,获取每组的第一条记录
    C/C++ 常量存储: 总结
    张庆科(山师大硕导简介) [转载]
    composer [packagist]包制作(入门篇)
    MMGCN: Multi-modal Graph Convolution Network for Personalized Recommendation of Micro-video
    opencv.js编译
    推荐
    推荐
    推荐
    Azure Automation (10) 在Automation中动态修改Azure Analysis Firewall防火墙规则
  • 原文地址:https://www.cnblogs.com/YY56/p/4717902.html
Copyright © 2020-2023  润新知