http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3736

解题:题目理解很关键。。

因为只有两种颜色。。所以二进制枚举。。。 如果出现某一个集合只有一种颜色(全为0,或者全为1)返回false,否则返回true。。

蛋疼的是读入。。蛋碎了一地。。

用了stringstream搞定

http://www.cppblog.com/Sandywin/archive/2007/07/13/27984.html

View Code
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<stdio.h>
#include<sstream>
using namespace std;
int n,m;
string str,ans;
const int maxn=10000;
vector<int>node[maxn];
int check(int id)
{
    int num=0;
    for(int i=1;i<=m;i++)
    {
        num=0;
        for(int j=0;j<node[i].size();j++)
        if(id&(1<<node[i][j]))
            num++;
        if(num==0||num==node[i].size())return 0;
    }
    return 1;
}
int main()
{
    int test;
  
    scanf("%d",&test);
    while(test--)
    {
        scanf("%d%d",&n,&m);
        getline(cin,str);
        for(int i=1;i<=m;i++)
            node[i].clear();
        for(int i=1;i<=m;i++)
        {
            getline(cin,str);
            stringstream sin;
            sin<<str;
            int a;
            while(sin>>a)
                node[i].push_back(a-1);//cout<<a<<endl;
                //cout<<endl;
        }
        int mm=1<<n;
        int flage=0;
        for(int i=1;i<mm;i++)
            if(check(i))
               {
                   flage=1;break;
               }
        if(flage)ans+='Y';
        else ans+='N';
        //getline(cin,str);
    }
    cout<<ans;
 
    return 0;
}
posted on 2012-10-05 21:35  一把刷子  阅读(210)  评论(0编辑  收藏  举报