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名学生(包含 ...
随机推荐
- Tensorflow细节-P89-collection的使用
知识总结 (1)再次注意summary的使用 (2)x = rdm.rand(dataset_size, 2) y_ = [[x1**2 + x2**2] for (x1, x2) in x]这里的问 ...
- MySQL 效率提高N倍的19条MySQL优化秘籍
一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型.一个好的sql语句至少 ...
- Problem 3 二维差分
$des$ 考虑一个 n ∗ n 的矩阵 A,初始所有元素均为 0.执行 q 次如下形式的操作: 给定 4 个整数 r,c,l,s, 对于每个满足 x ∈ [r,r+l), y ∈ [c,x−r+c] ...
- [C++]线程池 与 [Go] mapreduce
线程池 ref: https://github.com/progschj/ThreadPool/blob/master/ThreadPool.h ref: https://www.jianshu.co ...
- nginx+uwsgi+python3+pipenv+mysql+redis部署django程序
1.下载项目 git clone https://github.com/wangyitao/MyBlogs.git 2.进入Myblogs目录 cd MyBlogs 3.创建虚拟环境并且安装依赖 pi ...
- 线程池(3)-参数-实现ThreadFactory
1.介绍 ThreadFactory用来创建线程,需要实现newThread方法. 2.常用场景 线程重命名 设置守护进程 设置优先级 3.示例(线程重命名) public class ThreadF ...
- Java ArrayList几种遍历方法
import java.util.ArrayList; import java.util.Iterator; public class StringSampleDemo { public static ...
- hive (1)Cli命令
查看命令选项 # hive --help Usage ./hive <parameters> --service serviceName <service parameters> ...
- computed的用法
其实在摸板中也是可以做简单的计算的,但是会看起来会很乱 ,可以用computed来做计算 <!DOCTYPE html> <html lang="en"> ...
- Docker理论简答
Docker理论简答: 1. 介绍对docker的认识(10分) Docker是容器,容器不是docker Dockers就是一个文件夹,它欺骗操作系统说自己是一个操作系统,然后把所需要 ...