代码
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 100001;
int main() {
int n, m1;
cin>>n>>m1;
vector< vector<int> > v(MAX);
for(int i=0; i<n; i++) {
int a, b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
for(int i=0; i<m1; i++) {
int num;
cin>>num;
int array[num];
for(int j=0; j<num; j++) {
cin>>array[j];
}
int flag = 1;
for(int j=0; j<num; j++) {
for(int k=j+1; k<num; k++) {
for(int s=0; s<v[array[j]].size(); s++) {
if(v[array[j]][s]==array[k]) {
flag = 0;
break;
}
}
}
if(!flag) {
break;
}
}
if(flag) {
cout<<"Yes"<<endl;
} else {
cout<<"No"<<endl;
}
}
return 0;
}
注解
1、二重vector的使用。因为物品编号为5位数,因此创建100001个vector,每个vector的序号对应物品id。而vector内部又是一个vector。这相当于,每个物品在维护他的一个链表,也就是不能同时装入的物品的链表。
2、在查找每组物品是否能同时装入的时候,只需要两两匹配,遍历即可。当查找到某个物品在另一个物品的不能同时装入的链表内时,就把flag=0,立即退出循环。此时该组物品已经是不相容的了。