解题思路:每一个元素对应一个集合,把与之对应不能同时存在的元素存在集合中。对每一个清单中的元素,判断是否已经存在了,若是没有存在过,则设置为存在,同时把与之不能共存的元素都设成存在。这样一旦遍历到一个元素是存在的话,证明该清单中出现过了与之不能共存的元素,则该清单则为不合格的。代码如下:
#include <cstdio>
#include <iostream>
#include <set>
using namespace std;
int n,m;
const int maxn=100010;
set<int> pairs[maxn];
bool existed[maxn];
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
int id1,id2;
scanf("%d%d",&id1,&id2);
pairs[id1].insert(id2);
pairs[id2].insert(id1);
}
for(int i=0;i<m;i++){
fill(existed,existed+maxn,false);
int num;
bool flag=true;
scanf("%d",&num);
for(int j=0;j<num;j++){
int id;
scanf("%d",&id);
if(existed[id]==false){
existed[id]=true;
for(set<int>::iterator it=pairs[id].begin();it!=pairs[id].end();it++){
existed[*it]=true;
}
}else{
//如果该物品不该出现
flag=false;
}
}
if(flag == true)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}