具体解释请见代码注释
代码:
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
map<int,int> mapp; // 记录危险品名单
map<int,vector<int>> list; // 为每个危险品记录一个互斥名单
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
list[a].push_back(b);
list[b].push_back(a);
mapp[a]=1;
mapp[b]=1;
}
for(int i=0;i<m;i++){
int num;
cin>>num;
bool flag=1;
map<int,int> mapt = mapp;
for(int j=0;j<num;j++){
// 输入一个物品
int t;
cin>>t;
// 若不是危险品,跳过
map<int, int>::iterator iter = mapt.find(t);
if(iter==mapt.end()) continue;
// 若是危险品
for(int k=0;k<list[t].size();k++){
if(mapt[t]==-1){ // 如果已经存在互斥危险品
flag=0;
break;
}
else{ // 如果还没有出现互斥危险品,则把该物品的互斥危险品都标记为negtive
for(auto it : list[t]){
mapt[it]=-1;
}
}
}
}
if(!flag) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}