n对放在一起会爆炸的商品,输入几个个集合,判断是否会有放在一起会爆炸的商品,有输出No,没有输出Yes。
开头以为可以并查集,发现不同对中的商品ID有相同。改用数组,先将vecotr数组存储相互不能放在商品,再用一个数组标记这个集合中存在的ID,遍历该集合中的每个元素,判断跟其在一起会爆炸的商品是否在其中。这时用空间换时间。
#include <bits/stdc++.h>
using namespace std;
int num = 0;
vector<int> intVector[100000];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int x,y;
for(int i=0; i<n; i++) {
scanf("%d%d",&x,&y);
intVector[x].push_back(y);
intVector[y].push_back(x);
}
int k,num;
for(int i=0; i<m; i++) {
scanf("%d",&k);
vector<int> vec;
int exists[100000] = {0};
for(int j=0; j<k; j++) {
scanf("%d",&num);
vec.push_back(num);
exists[num] =1;
}
bool isIncompatible = false;
for(int j=0; j<k; j++) {
int index= vec[j];
for(int t=0; t<intVector[index].size(); t++) {
int eIndex =intVector[index][t];
if(exists[eIndex]) {
isIncompatible = true;
break;
}
}
if(isIncompatible) {
break;
}
}
if(isIncompatible) {
printf("No\n");
} else {
printf("Yes\n");
}
}
return 0;
}