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
- POJ 2584 T-Shirt Gumbo(二分图的多重匹配模板题)
- poj 2584 T-Shirt Gumbo 二分图多重匹配
- hdu 3605 Escape/poj 2584 T-Shirt Gumbo(二分图多重匹配)
- poj 2584 T-Shirt Gumbo 二分匹配
- POJ2584 T-Shirt Gumbo【二分图多重匹配】
- POJ2584 T-Shirt Gumbo【二分图多重匹配】
- POJ 2584 T-Shirt Gumbo 最大流和多重匹配
- poj 2584 T-Shirt Gumbo(最大匹配 )
- poj 2584 T-Shirt Gumbo 最大匹配
- poj 2584 T-Shirt Gumbo 最大匹配
- POJ2584_T-Shirt Gumbo(二分图多重最大匹配/最大流)
- T-Shirt Gumbo 二分最大匹配 hoj
- POJ-2584-T-Shirt Gumbo
- poj 2584T-Shirt Gumbo
- poj 2584 T-Shirt Gumbo
- POJ 2584 T-Shirt Gumbo
- PKU 2584 - T-Shirt Gumbo (二分图最大匹配 & 匈牙利算法 | 最大流 & EK)
- zoj 2192 || poj 2584 T-Shirt Gumbo
- [DL]2.使用Softmax回归进行手写数字识别
- 安装office2007安装程序找不到office.zh-cn\*三种详细解决方法
- 合并排序 | 分而治之
- 图文详解PDF与word、excel、ppt互转工具Solid PDF Tools v9的下载、安装与注册激活
- 求斐波拉契数 java
- POJ 2584 T-Shirt Gumbo(二分图的多重匹配模板题)
- mysql索引总结----mysql 索引类型以及创建
- myeclipse+maven搭建web项目方法二(超级详细)
- linux iscsi服务
- java中continue标记的使用
- keras中文文档笔记2——一些基本概念
- μCOS 系列专题—实时系统及相关概念(1)
- iOS APP跳转设置界面以及设置中的其他界面
- 如何在JSP页面中使用JSTL标签实现if和if-else判断,判断条件使用<%=value%>