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 NM. 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  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, 1N36, and indicates the number of T-shirts. Number M1M30, indicates the number of volunteers, with NM. 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

#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【二部图是否全匹配+DFS邻接矩阵实现】

• J_Dark
• 2013年04月21日 11:51
• 717

uva 11045 My T-shirt suits me

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

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

举报原因： 您举报文章：UVA 11045 My T-shirt suits me(网络流) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)