解题:题目理解很关键。。
因为只有两种颜色。。所以二进制枚举。。。 如果出现某一个集合只有一种颜色(全为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; }