题目链接: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 二分图的多重匹配的更多相关文章

  1. hihoCoder 1393 网络流三·二分图多重匹配(Dinic求二分图最大多重匹配)

    #1393 : 网络流三·二分图多重匹配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小H ...

  2. POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】

    Jamie's Contact Groups Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I ...

  3. POJ 2289 Jamie's Contact Groups(多重匹配+二分)

    题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...

  4. hdu 3605 Escape 二分图的多重匹配(匈牙利算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others)    ...

  5. POJ 1698 (二分图的多重匹配)

    转载:http://www.cppblog.com/MatoNo1/archive/2011/03/26/142766.aspx 我们知道在一个图中,每个点最多只能匹配一条边的情况,是二分图的最大匹配 ...

  6. POJ - 2289 Jamie's Contact Groups (二分图多重匹配)

    题意:N个人,M个团体.每个人有属于自己的一些团体编号.将每个人分配到自己属于的团体中,问这个人数最多的团体其人数最小值是多少. 分析:一个一对多的二分图匹配,且是最大值最小化问题.二分图的多重匹配建 ...

  7. [USACO2003][poj2112]Optimal Milking(floyd+二分+二分图多重匹配)

    http://poj.org/problem?id=2112 题意: 有K个挤奶器,C头奶牛,每个挤奶器最多能给M头奶牛挤奶. 每个挤奶器和奶牛之间都有一定距离. 求使C头奶牛头奶牛需要走的路程的最大 ...

  8. POJ2289:Jamie's Contact Groups(二分+二分图多重匹配)

    Jamie's Contact Groups Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/ ...

  9. hiho 第117周 二分图多重匹配,网络流解决

    描述 学校的秋季运动会即将开始,为了决定参赛人员,各个班又开始忙碌起来. 小Hi和小Ho作为班上的班干部,统计分配比赛选手的重任也自然交到了他们手上. 已知小Hi和小Ho所在的班级一共有N名学生(包含 ...

随机推荐

  1. Mybatis下Oracle插入新增返回主键id

    具体xml中sql是这样写,但是要注意SQ_USER.Nextval,SQ_USER是序列,你要替换下自己要进行操作的表的序列,不知道序列的话,可以sql查找下,select * from user_ ...

  2. Continuous Subarray Sum II

    Description Given an circular integer array (the next element of the last element is the first eleme ...

  3. Spring入门(一)——IOC

    1. IOC定义 Inversion of Control,减低计算机代码间的耦合度,对象的创建交给外部容器完成,不用再new了 2. 流程 2.1 创建Bean对象 package bean; pu ...

  4. 【mysql】连接和断开服务器

    [mysql]连接和断开服务器 #启动服务: $sudo service mysql start #停止服务: $sudo service mysql stop 要连接到服务器,我们通常需要提供MyS ...

  5. leetcode解题报告(29):Student Attendance Record I

    描述 You are given a string representing an attendance record for a student. The record only contains ...

  6. 洛谷 P2032 扫描 题解

    P2032 扫描 题目描述 有一个 1 ∗ n 的矩阵,有 n 个正整数. 现在给你一个可以盖住连续的 k 的数的木板. 一开始木板盖住了矩阵的第 1 ∼ k 个数,每次将木板向右移动一个单位,直到右 ...

  7. UOJ226. 【UR #15】奥林匹克环城马拉松 [组合数学,图论]

    UOJ 思路 我们知道关于有向图欧拉回路计数有一个结论:在每个点入度等于出度的时候,答案就是 \[ t_w(G)\prod (deg_i-1)! \] 其中\(t_w(G)\)是以某个点为根的树形图个 ...

  8. fuck-KUNLUN昆仑ECRS会员管理系统

    写代码要认证一点,多一点测试, navigator.appName == 'Netscape'这么垃圾的代码都能写出来,握草. 怕时间就了就忘记怎么搞的了,MD经过前端各种断点,找到了这个垃圾玩意儿. ...

  9. 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。

    快速阅读 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控. 我们知道sql server 中有个工具叫sql profile ,可以实时监控sql server中 执行的sql 语句,以 ...

  10. 【转载】sudoers改坏后无法使用sudo的解决办法

    练习安装odoo的时候,创建了一个odoo用户,想把它赋予sudo权限,然而,编辑的时候不留意,改坏了,导致sudo无法使用,无法编辑sudoers文件修改回来. 提示如下信息: >>&g ...