POJ 2584 T-Shirt Gumbo(二分图的多重匹配模板题)

来源:互联网 发布:苹果手机主题软件 编辑:程序博客网 时间:2024/06/15 18:36

题目地址
题意:现在有5种型号(S、M、L、X、T)的衣服要发放给n名参赛队员。给出每位参赛者所需要衣服型号的最小值和最大值。只要是在这个范围内的型号参赛者都能接受。再给出这5种型号衣服各自的数量,问是不是每个参赛队员都有衣服穿。
思路:以衣服的型号大小来分别建点(n+1~n+5),然后做一遍二分图的多重匹配就好了(模板题)
(吐槽下自己,建点的时候衣服型号是加了n的,但是在存每种衣服型号的数量的时候居然忘了加n,但是样例居然过了,搞得WA找了半天错误)

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define N 50#define LL __int64#define inf 0x3f3f3f3f#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1using namespace std;const LL mod = 1e9 + 7;int n;struct Hungarian_Plus {    vector<int> mapp[N];    bool vis[N];//是否为匹配点    int mark[N][N];//该边与哪个点构成的边为匹配边    int limit[N], used[N];    void init() {        for (int i = 0; i <= n + 5; i++) {            mapp[i].clear();        }        memset(mark, -1, sizeof(mark));    }    void add(int a, int b) {        mapp[a].push_back(b);        mapp[b].push_back(a);    }    bool dfs(int u) {        for (int i = 0; i < mapp[u].size(); i++) {            int v = mapp[u][i];            if (!vis[v]) {                vis[v] = true;                if (used[v] < limit[v]) {//如果还有空间可以匹配                    mark[v][used[v]++] = u;                    return true;                }                for (int j = 0; j < limit[v]; j++) {                    if (dfs(mark[v][j])) {                        mark[v][j] = u;                        return true;                    }                }            }        }        return false;    }    void solve() {        int sum = 0;        memset(used, 0, sizeof(used));        for (int i = 1; i <= n; i++) {//枚举非匹配点            memset(vis, false, sizeof(vis));            if (dfs(i)) {                sum++;//最大匹配的个数            }        }        if (sum == n) {            cout << "T-shirts rock!" << endl;        }        else {            cout << "I'd rather not wear a shirt anyway..." << endl;        }    }}hungarian;int main() {    cin.sync_with_stdio(false);    int a, b;    string str;    while (cin >> str) {        if (str == "ENDOFINPUT") {            break;        }        cin >> n;        hungarian.init();        for (int i = 1; i <= n; i++) {            cin >> str;            if (str[0] == 'S') {                a = 1;            }            else if (str[0] == 'M') {                a = 2;            }            else if (str[0] == 'L') {                a = 3;            }            else if (str[0] == 'X') {                a = 4;            }            else if (str[0] == 'T') {                a = 5;            }            if (str[1] == 'S') {                b = 1;            }            else if (str[1] == 'M') {                b = 2;            }            else if (str[1] == 'L') {                b = 3;            }            else if (str[1] == 'X') {                b = 4;            }            else if (str[1] == 'T') {                b = 5;            }            for (int j = a; j <= b; j++) {                hungarian.add(i, j + n);            }        }        for (int i = n + 1; i <= n + 5; i++) {//WA点            cin >> hungarian.limit[i];        }        cin >> str;        hungarian.solve();    }    return 0;}
阅读全文
0 0
原创粉丝点击