思路
1、用一个数组来记录物品不相容的对应关系,我这里用stuff[n][2]记录成对出现的两个物品编号;
2、本质上还是循坏遍历,看是否有成对的物品出现在清单里,思路就是对于每个清单,在stuff里面遍历,看stuff[i][0]和 stuff[i][1]是否都在清单里面。这里用bsearch折半查找会快一些,注意用bsearch前先qsort。
AC代码
#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a,const void* b){//qsort和bsearch
return *(int*)a-*(int*)b;
}
int main(){
int n,m,k;
scanf("%d %d",&n,&m);
int stuff[n][2],list[1000];
for(int i=0;i<n;i++){
scanf("%d %d",&stuff[i][0],&stuff[i][1]);
}
for(int i=0;i<m;i++){
int flag=0;
scanf("%d",&k);
for(int j=0;j<k;j++)scanf("%d",&list[j]);
qsort(list,k,sizeof(int),cmp);
for(int j=0;j<n;j++){
int* t1=bsearch(&stuff[j][0],list,k,sizeof(int),cmp);
int* t2=bsearch(&stuff[j][1],list,k,sizeof(int),cmp);
if(t1!=NULL&&t2!=NULL){
flag=1;//成对出现的标志位
break;
}
}
if(flag==1)printf("No\n");
else printf("Yes\n");
}
return 0;
}