思路:
- (超时代码)最开始的时候,我用了超时代码(见下文),主要是将一堆冲突的物品作为结构体,每次在判断携带物品的数据时,将结构体内每个物体标记是否携带。最后再循环整个结构体数组,判读是否有冲突。这种方法时间复杂度极高。
- (AC代码)随后反向思考,为携带的物品做映射,如果带了标记为1。再去循环整个结构体数组,判读两个冲突的物品是否都存在。
AC代码:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef struct {
int a,b;
}crash;
int main(){
int n,m,k;
scanf("%d%d",&n,&m);
cin.get();
int t;
crash c[10000];
for(int i=0;i<n;i++){
cin>>c[i].a>>c[i].b;
}
for(int i=0;i<m;i++){
map<int,int> MAP;
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%d",&t);
MAP[t]=1;
}
int tag=1;
for(int i=0;i<n;i++){
if(MAP[c[i].a]>0&&MAP[c[i].b]>0){
tag=0;
break;
}
}
if(tag==0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
超时代码:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef struct {
int a,b;
int t1,t2;
}crash;
int main(){
int n,m,k;
scanf("%d%d", &n, &m);
cin.get();
int t;
crash c[10000];
for(int i=0;i<n;i++){
scanf("%d%d", &c[i].a, &c[i].b);
c[i].t1=c[i].t2=0;
}
for(int i=0;i<m;i++){
scanf("%d",&k);
int tag=1;
for(int j=0;j<k;j++){
scanf("%d",&t);
for(int v=0;v<n;v++){
if(t==c[v].a){
c[v].t1=1;
}
else if(t==c[v].b){
c[v].t2=1;
}
}
}
for(int i=0;i<n;i++){
if(c[i].t1==1&&c[i].t2==1){
tag=0;
break;
}
}
if(tag==0)
printf("No\n");
else
printf("Yes\n");
for(int i=0;i<n;i++){
c[i].t1=c[i].t2=0;
}
}
return 0;
}