解法一:
用一个map<int,vector<int>> G 标记每个物品对应的不相容物品
引入一个ban数组,用来标记出现到第j个物品时,都有哪些物品不能出现,如果第j个物品可以出现,将其不相容物品在ban中标记为1,否则,flag=false;
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int N,M;
unordered_map<int,vector<int>> G;
int main(){
cin>>N>>M;
for(int i=0;i<N;i++){
int a,b;
scanf("%d %d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
}
for(int i=0;i<M;i++){
int K;
bool flag=true;
scanf("%d",&K);
vector<int> ban(100000,0);
vector<int> goods(K);
for(int j=0;j<K;j++){
scanf("%d",&goods[j]);
if(flag){
if(ban[goods[j]]==1){
flag=false;
}
for(auto it:G[goods[j]]){
ban[it]=1;
}
}
}
if(flag){
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}
解法二:
用一个vector存储不相容物品,第2*i与第2*i+1不可同时出现
用一个hash表标记某个物品是否出现。将一个序列读完后,检查每对不相容物品是否同时出现,若同时出现则flag=false;
#include<iostream>
#include<vector>
using namespace std;
int main(){
int N,M;
cin>>N>>M;
vector<int> v;
for(int i=0;i<N;i++){
int a,b;
scanf("%d %d",&a,&b);
v.push_back(a);
v.push_back(b);
}
for(int i=0;i<M;i++){
int K;
scanf("%d",&K);
bool flag=true;
vector<int> hash(100000,0);
for(int m=0;m<K;m++){
int x;
scanf("%d",&x);
hash[x]=1;
}
for(int y=0;y<v.size();y+=2){
if(hash[v[y]]==1&&hash[v[y+1]]==1){
flag=false;
cout<<"No\n";
break;
}
}
if(flag){
cout<<"Yes\n";
}
}
return 0;
}