UVA 11045 My T-shirt suits me(网络流)

原创 2013年12月02日 15:48:14


  My T-shirt suits me 

Our friend Victor participates as an instructor in an environmental volunteer program. His boss asked Victor to distribute N T-shirts to M volunteers, one T-shirt each volunteer, where N is multiple of six, and N$ \ge$M. There are the same number of T-shirts of each one of the six available sizes: XXL, XL, L, M , S, and XS. Victor has a little problem because only two sizes of the T-shirts suit each volunteer.


You must write a program to decide if Victor can distribute T-shirts in such a way that all volunteers get a T-shirt that suit them. If N $ \neq$ M, there can be some remaining T-shirts.

Input 

The first line of the input contains the number of test cases. For each test case, there is a line with two numbers N and MN is multiple of 6, 1$ \le$N$ \le$36, and indicates the number of T-shirts. Number M1$ \le$M$ \le$30, indicates the number of volunteers, with N$ \ge$M. Subsequently, M lines are listed where each line contains, separated by one space, the two sizes that suit each volunteer (XXL, XL, L, M , S, or XS).

Output 

For each test case you are to print a line containing YES if there is, at least, one distribution where T-shirts suit all volunteers, or NO, in other case.

Sample Input 

 
3
18 6
L XL
XL L
XXL XL
S XS
M S
M L
6 4
S XL
L S
L XL
L XL
6 1
L M

Sample Output 

 
YES
NO
YES

题意:有6种size的T-shirt,每种n / 6件,有m个人,每人有两种size可以穿,问能否所有人都穿到T-shirt

思路:写了两种,一种暴力,一种最大流

代码:

暴力枚举

#include <stdio.h>
#include <string.h>
const int M = 35;
const char size[6][10] = {"XS", "S", "M", "L", "XL", "XXL"};
int T, n, m, s[M][2], have[6];
char a[10], b[10];

int find(char *a) {
    for (int i = 0; i < 6; i ++)
	if (strcmp(size[i], a) == 0)
	    return i;
}
void init() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < 6; i ++)
	have[i] = n / 6;
    for (int i = 0; i < m; i ++) {
	scanf("%s%s", a, b);
	s[i][0] = find(a);
	s[i][1] = find(b);
    }
}

bool dfs(int start) {
    if (start == m)
	return true;
    for (int i = 0; i < 2; i ++) {
	if (have[s[start][i]]) {
	    have[s[start][i]] --;
	    if (dfs(start + 1)) return true;
	    have[s[start][i]] ++;
	}
    }
    return false;
}

void solve() {
    init();
    if (dfs(0)) printf("YES\n");
    else printf("NO\n");
}
int main() {
    scanf("%d", &T);
    while (T --) {
	solve();
    }
    return 0;
}

最大流

#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
#include <queue>
using namespace std;
const char size[6][10] = {"XS", "S", "M", "L", "XL", "XXL"};

int T, n, m, g[50][50], f[50][50], p[50], a[50];
char str1[10], str2[10];
queue<int>q;

int find(char *a) {
    for (int i = 0; i < 6; i ++) {
	if (strcmp(a, size[i]) == 0)
	    return i;
    }
}

void init() {
    scanf("%d%d", &n, &m);
    memset(g, 0, sizeof(g));
    for (int i = m + 1; i <= m + 6; i ++)
	g[0][i] = n / 6;
    for (int i = 1; i <= m; i ++) {
	scanf("%s%s", str1, str2);
	g[find(str1) + m + 1][i] = 1;
	g[find(str2) + m + 1][i] = 1;
	g[i][m + 7] = 1;
    }
}

void solve() {
    init();
    int ans = 0, s = 0, t = m + 7;
    memset(f, 0, sizeof(f));
    while (1) {
	memset(a, 0, sizeof(a));
	a[s] = INF;
	q.push(s);
	while (!q.empty()) {
	    int u = q.front(); q.pop();
	    for (int v = 1; v <= t; v ++) {
		if (!a[v] && g[u][v] - f[u][v] > 0) {
		    a[v] = min(a[u], g[u][v] - f[u][v]);
		    q.push(v); p[v] = u;
		}
	    }
	}
	if (a[t] == 0) break;
	for (int u = t; u != s; u = p[u]) {
	    f[p[u]][u] += a[t];
	    f[u][p[u]] -= a[t];
	}
	ans += a[t];
    }
    if (ans < m) printf("NO\n");
    else printf("YES\n");
}

int main() {
    scanf("%d", &T);
    while (T --) {
	solve();
    }
    return 0;
}


相关文章推荐

UVa 11045 My T-shirt suits me (网络流建图+最大流)

题意:公司要给志愿者发服装,有N件衣服,分别为N/5套衣服,每套衣服6种型号,有M个志愿者,然后每个志愿者分别可以适应2种型号的衣服,问所给的衣服够多吗。 可以用网络流来做,构图时想一想就行了,...

UVA - 11045 My T-shirt suits me (最大流-二分图匹配)

题目大意: 有n件衣服,m个人。 有6种型号衣服,没种衣服件数一样,每种型号n/6件。 每个人可以适合穿两种型号的衣服。 问:能否让所有人都穿上合适的衣服。 解析: 首先图有两个部分,...

UVa11045 My T-shirt suits me

题意:共有n件衣服,m个人,n》衣服数量

UVA 11045 My T-shirt suits me (二分图)

题意: 有n(n是6的倍数)件衣服,6种尺码,每种尺码的衣服数量相同,有m个人,每人有两种能穿的尺码,问每个人是否都有衣服穿。 分析: 显然的二分图。每个人向其合适的尺码连边,容量为1;增加源点和汇点...

UVA 11045 My T-shirt suits me【二部图是否全匹配+DFS邻接矩阵实现】

题目大意:1,西服有六种款式{"XXL", "XL", "L", "M", "S", "XS"},给出西服总数,保证西服总数是衣服款式的整数倍,即每款西服数量相同;                 ...
  • J_Dark
  • J_Dark
  • 2013年04月21日 11:51
  • 717

uva 11045 My T-shirt suits me

uva 11045 My T-shirt suits me 二分图 最大流求解

POJ 2584 T-Shirt Gumbo(网络流之最大流)

题目地址:POJ 2584 大水题。。不多说。。sha

网络流24题之T1 飞行员配对方案问题

本题是一道标准的二分图匹配问题,但是也可以用来做网络流的入门题。

7.12图论练习赛 T2 幻想乡的符卡 (网络流最小割)

题目题解这题主要是考察建边。限制条件有三:等级,火力,时长。 解决等级和火力的方法是二分答案,可以二分等级,将不满足等级的符卡直接跳过,建边check火力大小的值。 解决时长有两个部分:普通的通过...

[网络流24题]T1 飞行员配对方案问题

呣唔,很水的一道二分图最大匹配 裸奔一个匈牙利算法就能过,然而太久没写忘记了,下次补上。 为什么不用dinic呢→_→ 简单好写效率高 超级源点s连外籍士兵,流量为1; 外籍士兵连可行的英国士兵,流量...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 11045 My T-shirt suits me(网络流)
举报原因:
原因补充:

(最多只允许输入30个字)