POJ 2584 T-Shirt Gumbo 二分图的多重匹配
题目链接:http://poj.org/problem?id=2584
题目大意:有SMLXT五种T恤型号,有N个人,每个人有一个可选的型号区间,你现在要发给N个人每人一条他可以选择的型号的T恤,问能否实现。
题目分析:二分图多重匹配模板题。
我们利用匈牙利算法来解决这道题。
但是因为这里是多重匹配,所以我们要稍微修改一下:
vec[i]
用于存放型号i的衣服目前已分配的所有用户的编号;link[i]
用于存储第i个用户目前获得的衣服的型号,如果没有获得则link[i] == -1
;cover[i][j]
用于表示这一次匹配第i个信号的第j件衣服有没有访问过。
代码:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 22;
int n, m = 5, smallest[maxn], biggest[maxn], cnt[6];
vector<int> link[6];
bool cover[6][maxn];
string s;
bool dfs(int x, int pos, int y) {
cover[x][pos] = true;
if (link[x].size() <= pos) {
link[x].push_back(y);
return true;
}
for (int i = 0; i < cnt[x]; i ++) {
int z = link[x][i];
for (int j = smallest[z]; j <= biggest[z]; j ++) {
for (int k = 0; k < cnt[j]; k ++) {
if (!cover[j][k] && dfs(j,k, z) == true) {
return true;
}
}
}
}
return false;
}
bool solve() {
for (int i = 1; i <= 5; i ++) link[i].clear();
int ans = 0;
for (int i = 1; i <= n; i ++) {
bool flag = false;
memset(cover, false, sizeof(cover));
for (int j = smallest[i]; j <= biggest[i]; j ++) {
bool flag = false;
for (int k = 0; k < cnt[j]; k ++) {
if (!cover[j][k] && dfs(j, k, i) == true) {
flag = true;
break;
}
}
if (flag == true) {
ans ++;
break;
}
}
if (ans < i) return false;
}
return true;
}
int main() {
while (cin >> s) {
if (s == "ENDOFINPUT") break;
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> s;
switch (s[0]) {
case 'S': smallest[i] = 1; break;
case 'M': smallest[i] = 2; break;
case 'L': smallest[i] = 3; break;
case 'X': smallest[i] = 4; break;
case 'T': smallest[i] = 5; break;
default: break;
}
switch (s[1]) {
case 'S': biggest[i] = 1; break;
case 'M': biggest[i] = 2; break;
case 'L': biggest[i] = 3; break;
case 'X': biggest[i] = 4; break;
case 'T': biggest[i] = 5; break;
default: break;
}
}
for (int i = 1; i <= m; i ++) cin >> cnt[i];
cin >> s;
puts(solve() ? "T-shirts rock!" : "I'd rather not wear a shirt anyway...");
}
return 0;
}
POJ 2584 T-Shirt Gumbo 二分图的多重匹配的更多相关文章
- hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)
#1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...
- POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
Jamie's Contact Groups Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- POJ 2289 Jamie's Contact Groups(多重匹配+二分)
题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- POJ 1698 (二分图的多重匹配)
转载:http://www.cppblog.com/MatoNo1/archive/2011/03/26/142766.aspx 我们知道在一个图中,每个点最多只能匹配一条边的情况,是二分图的最大匹配 ...
- POJ - 2289 Jamie's Contact Groups (二分图多重匹配)
题意:N个人,M个团体.每个人有属于自己的一些团体编号.将每个人分配到自己属于的团体中,问这个人数最多的团体其人数最小值是多少. 分析:一个一对多的二分图匹配,且是最大值最小化问题.二分图的多重匹配建 ...
- [USACO2003][poj2112]Optimal Milking(floyd+二分+二分图多重匹配)
http://poj.org/problem?id=2112 题意: 有K个挤奶器,C头奶牛,每个挤奶器最多能给M头奶牛挤奶. 每个挤奶器和奶牛之间都有一定距离. 求使C头奶牛头奶牛需要走的路程的最大 ...
- POJ2289:Jamie's Contact Groups(二分+二分图多重匹配)
Jamie's Contact Groups Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/ ...
- hiho 第117周 二分图多重匹配,网络流解决
描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含 ...
随机推荐
- CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)
题目 最小割树模板 算法详解及证明见: 2016年国家队候选队员论文 <浅谈无向图最小割问题的一些算法及应用--绍兴一中 王文涛> 3.2节 CODE #include <bits/ ...
- Oracle 异步IO 优缺点
一.Oracle在Linux下使用异步IO配置 最近在测试Oracle的时候,很想测试下使用异步IO的性能.但是异步IO是需要专门配置的,否则的话,容易遇到很著名的“ORA-01578: ORACLE ...
- QGraphicsView,QGraphicsScene,QGraphicsItem
参考:Qt4 开发实践第八章 图形视图QGraphicsView #ifndef DRIVEDGRAPH_H #define DRIVEDGRAPH_H #include <QObject> ...
- element-ui upload上传组件问题记录
element-ui upload上传组件遇到的问题
- 45、sparkSQL UDF&UDAF
一.UDF 1.UDF UDF:User Defined Function.用户自定义函数. 2.scala案例 package cn.spark.study.sql import org.apach ...
- [golang][vue] 前后端分离、微服务架构等等---通用后台权限管理系统001
emmm暂未开源,先上图.其实有很多东东都未完成,一步一步来吧 这里是大图 这里会有二维码的,暂未写完哈 注册界面 后台 测试地址 测试地址al.landv.pw:88 测试账号:admin 测试密码 ...
- git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法
在服务器添加完公钥后报错 sign_and_send_pubkey: signing failed: agent refused operation 这个时候我们只要执行下 eval "$( ...
- appium 多线程还是多进程(转)
https://www.cnblogs.com/zouzou-busy/p/11440175.html 在前面我们都是使用一个机器进行测试,在做app自动化的时候,我们要测不同的机型,也就是兼容性测试 ...
- python 日期
python datetime库使用和时间加减计算 来自:https://www.cnblogs.com/linkenpark/p/8079337.html datetime库使用 一.操作当前时间 ...
- 创建加载bean的实例
一.创建实例 工程的结构如下图 1.创建接口 public interface Person { public void setName(String name); public String say ...