博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
阅读量:4616 次
发布时间:2019-06-09

本文共 4179 字,大约阅读时间需要 13 分钟。

题意

现在要将5种型号的衣服分发给n个参赛者,然后给出每个参赛者所需要的衣服的尺码的大小范围,在该尺码范围内的衣服该选手可以接受,再给出这5种型号衣服各自的数量,问是否存在一种分配方案使得每个选手都能够拿到自己尺码范围内的衣服.

思路

明显的
二分图多重最大匹配问题:每个点能匹配的边不再限制1个,而是多个。 做法:
最大流。虽说也有对应的匈牙利算法,但是我还是图省事用最大流做了。 建图:源点连接每个型号的衣服,容量为能够匹配的个数(数量),汇点连接每个队员,容量也为能够匹配的个数(1),其他匹配边容量为1。

代码

 
#include #include #include #include #include #include #include #define MID(x,y) ((x+y)/2)#define mem(a,b) memset(a,b,sizeof(a))using namespace std;const int MAXV = 35;const int MAXE = 205;const int oo = 0x3fffffff;template struct Dinic{    struct flow_node{        int u, v;        T flow;        int opp;        int next;    }arc[2*MAXE];    int vn, en, head[MAXV];    int cur[MAXV];    int q[MAXV];    int path[2*MAXE], top;    int dep[MAXV];    void init(int n){        vn = n;        en = 0;        mem(head, -1);    }    void insert_flow(int u, int v, T flow){        arc[en].u = u;        arc[en].v = v;        arc[en].flow = flow;        arc[en].next = head[u];        head[u] = en ++;        arc[en].u = v;        arc[en].v = u;        arc[en].flow = 0;        arc[en].next = head[v];        head[v] = en ++;    }    bool bfs(int s, int t){        mem(dep, -1);        int lq = 0, rq = 1;        dep[s] = 0;        q[lq] = s;        while(lq < rq){            int u = q[lq ++];            if (u == t){                return true;            }            for (int i = head[u]; i != -1; i = arc[i].next){                int v = arc[i].v;                if (dep[v] == -1 && arc[i].flow > 0){                    dep[v] = dep[u] + 1;                    q[rq ++] = v;                }            }        }        return false;    }    T solve(int s, int t){        T maxflow = 0;        while(bfs(s, t)){            int i, j;            for (i = 1; i <= vn; i ++)  cur[i] = head[i];            for (i = s, top = 0;;){                if (i == t){                    int mink;                    T minflow = 0x7fffffff;						//要比容量的oo大                    for (int k = 0; k < top; k ++)                        if (minflow > arc[path[k]].flow){                            minflow = arc[path[k]].flow;                            mink = k;                        }                    for (int k = 0; k < top; k ++)                        arc[path[k]].flow -= minflow, arc[path[k]^1].flow += minflow;                    maxflow += minflow;                    top = mink;                    i = arc[path[top]].u;                }                for (j = cur[i]; j != -1; cur[i] = j = arc[j].next){                    int v = arc[j].v;                    if (arc[j].flow && dep[v] == dep[i] + 1)                        break;                }                if (j != -1){                    path[top ++] = j;                    i = arc[j].v;                }                else{                    if (top == 0)   break;                    dep[i] = -1;                    i = arc[path[-- top]].u;                }            }        }        return maxflow;    }};Dinic  dinic;int main(){	//freopen("test.in", "r", stdin);	//freopen("test.out", "w", stdout);	string s;	while(cin >> s){        if (s == "ENDOFINPUT")            break;        int n;        cin >> n;        dinic.init(n+7);        for (int i = 1; i <= n; i ++){            string tmp;            cin >> tmp;            dinic.insert_flow(i+5, n+7, 1);            for (int j = 0; j < (int)tmp.size(); j ++){                switch (tmp[j]){                case 'S':                    dinic.insert_flow(1, i+5, 1);                case 'M':                    dinic.insert_flow(2, i+5, 1);                case 'L':                    dinic.insert_flow(3, i+5, 1);                case 'X':                    dinic.insert_flow(4, i+5, 1);                case 'T':                    dinic.insert_flow(5, i+5, 1);                    break;                }            }        }        for (int i = 1; i <= 5; i ++){            int num;            cin >> num;            dinic.insert_flow(n+6, i, num);        }        if (dinic.solve(n+6, n+7) == n){            puts("T-shirts rock!");        }        else{            puts("I'd rather not wear a shirt anyway...");        }        cin >> s;    }	return 0;}

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114074.html

你可能感兴趣的文章
洛谷P2776 [SDOI2007]小组队列 链表 + 模拟
查看>>
ORA-39006错误原因及解决办法
查看>>
linux常用目录与作用
查看>>
更换CentOS7的下载源为阿里云
查看>>
jQuery点击收缩展开滑动显示内容竖直手风琴代码
查看>>
PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
查看>>
线程池+协程+gevent模块
查看>>
小兔子繁殖的问题
查看>>
浏览器端Less
查看>>
稀疏表(ST / Sparse Table)
查看>>
机会是创造出来的,绝不是等来的
查看>>
负载测试培训
查看>>
c++11并发机制
查看>>
#import与@class的区别
查看>>
树莓派如何便捷的使用pi4j
查看>>
MySQL 中的索引
查看>>
CxImage Practice
查看>>
12个优秀的云计算操作系统
查看>>
ubuntu下使用罗技Unifying
查看>>
AJAX应用的五个步骤
查看>>