zoukankan      html  css  js  c++  java
  • POJ2584 T-Shirt Gumbo【二分图多重匹配】

    题目链接:

    http://poj.org/problem?id=2584


    题目大意:

    如今有5种型号(S、M、L、X、T)的衣服要发放给N个參赛队员。给出每一个參赛者所须要衣服型号的范围。

    在这个范围内的型号參赛者都能接受。再给出这5种型号衣服各自的数量,那么问题来了:是否存在一种

    分配方案使得全部參赛队员都可以拿到自己型号范围内的衣服。


    思路:

    二分图匹配是一个对一个的匹配,这里是一对多匹配。须要用二分图多重匹配的模型来做。详细就是把原

    先匈牙利算法中的cy[MAXN]更换为一个2维数组cy[MAXN][MAXN]。

    cy[i][j]表示与元素yi匹配的第j个元

    素,同一时候用vey[i]来记录与元素yi匹配的元素的数量。


    AC代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int MAXN = 33;
    
    int Map[MAXN][MAXN];
    bool Mask[MAXN];
    int NX,NY,N;
    
    int vcy[MAXN];
    int cy[MAXN][MAXN];
    
    int limit[MAXN];
    
    bool FindPath(int u)
    {
        for(int i = 1; i <= 5; ++i)
        {
            if(Map[u][i] && !Mask[i])
            {
                Mask[i] = 1;
                if(vcy[i] < limit[i])
                {
                    cy[i][vcy[i]++] = u;
                    return true;
                }
    
                for(int j = 0; j < limit[i]; ++j)
                {
                    if(FindPath(cy[i][j]))
                    {
                        cy[i][j] = u;
                        return true;
                    }
                }
            }
        }
        return false;
    }
    
    void MulMatch()
    {
        int Ans = 0;
        memset(vcy,0,sizeof(vcy));
        for(int i = 1; i <= N; ++i)
        {
            memset(Mask,0,sizeof(Mask));
            Ans += FindPath(i);
    
        }
        if(Ans == N)
            printf("T-shirts rock!
    ");
        else
            printf("I'd rather not wear a shirt anyway...
    ");
    }
    
    int main()
    {
        char s[20];
        while(~scanf("%s",s))
        {
            if(strcmp(s,"ENDOFINPUT") == 0)
                break;
            scanf("%d",&N);
            memset(Map,0,sizeof(Map));
            for(int i = 1; i <= N; ++i)
            {
                scanf("%s",s);
                char a = s[0];
                char b = s[1];
                int u,v;
                if(a == 'S')
                    u = 1;
                else if(a == 'M')
                    u = 2;
                else if(a == 'L')
                    u = 3;
                else if(a == 'X')
                    u = 4;
                else if(a == 'T')
                    u = 5;
    
                if(b == 'S')
                    v = 1;
                else if(b == 'M')
                    v = 2;
                else if(b == 'L')
                    v = 3;
                else if(b == 'X')
                    v = 4;
                else if(b == 'T')
                    v = 5;
                for(int j = u; j <= v; ++j)
                    Map[i][j] = 1;
            }
            for(int i = 1; i <= 5; ++i)
                scanf("%d",&limit[i]);
            scanf("%s",s);
            MulMatch();
        }
    
        return 0;
    }


  • 相关阅读:
    python爬虫之Scrapy框架
    Web自动化测试工具:Selenium
    多线程爬取新闻标题和链接
    python里更推荐使用的requests库
    python豆瓣的简单爬虫
    4 个好用的 Linux 监控工具
    8个你会爱上的 VS Code 扩展
    SpringBoot 构建 Docker 镜像的 3 种方式
    OAuth2 图解
    Prometheus + Grafana 监控 SpringBoot
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5175304.html
Copyright © 2011-2022 走看看