巨水。。。直接回溯暴力居然过了。。。

#include <algorithm>
#include <cstring>
#include <cstdio>
#define N 110

char s[6][5]= {"XXL","XL","L","M","S","XS"};
int solve(char *str)
{
    for(int i=0; i<6; ++i)
        if(!strcmp(str,s[i]))
            return i;
}
struct dat
{
    int u,v;
} ans[N];
int n,m;
int vis[N],num[N];
bool dfs(int cur)
{
    if(cur==m)
    {
        for(int i=0; i<m; ++i)
            if(num[i]>n) return false;
        return true;
    }
    int u=ans[cur].u;
    int v=ans[cur].v;
    num[u]++;
    if(num[u]>n)
        num[u]--;
    else
    {
        if(dfs(cur+1))
            return true;
        num[u]--;
    }
    num[v]++;
    if(num[v]>n) num[v]--;
    else
    {
        if(dfs(cur+1)) return true;
        num[v]--;
    }
    return false;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        char str[8],s2[8];
        scanf("%d %d",&n,&m);

        for(int i=0; i<m; ++i)
        {
            scanf("%s %s",str,s2);
            ans[i].u=solve(str);
            ans[i].v=solve(s2);
        }
        memset(num, 0, sizeof(num));
        n/=6;
        if(dfs(0))
        {
            puts("YES");
        }
        else
        {
            puts("NO");
        }
    }
    return 0;
}
View Code

 

posted on 2013-10-24 23:21  风流monkey  阅读(116)  评论(0编辑  收藏  举报