题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/1038429484026175488
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstdlib>
#include <sstream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
using namespace std;
const int maxn_1=110;
int a_1[maxn_1],a_2[maxn_1];//对应的不相容物品
int main(){
int N,M;
scanf("%d%d",&N,&M);
//每一种液体可能与多种液体不相容,下述代码错误,
/* for(int i=0;i<N;i++){
scanf("%d%d",&a_1[i],&a_2[i]);
}
*/
map<int,vector<int> > m;
for(int i=0;i<N;i++){
int t1,t2;
scanf("%d%d",&t1,&t2);
m[t1].push_back(t2);
m[t2].push_back(t1);
}
while(M--){
int cnt,flag=0,a[100000]={0};
scanf("%d",&cnt);
vector<int> vec(cnt);
for(int j=0;j<cnt;j++){
scanf("%d",&vec[j]);
a[vec[j]]=1;
}
for(int i=0;i<vec.size();i++){
//统计该箱货物
for(int j=0;j<m[vec[i]].size();j++){
//在不相容物品中,寻找该箱物品的每一个(已利用map变量m建立关系不相容物品的关系),确定在该箱中是否出现
if(a[m[vec[i]][j]]==1) flag=1;
}
}
if(flag){
printf("No\n");
}
else{
printf("Yes\n");
}
}
/*
while(M--){
int cnt,tmp;
set<int> pro;
scanf("%d",&cnt);
for(int j=0;j<cnt;j++){
scanf("%d",&tmp);
pro.insert(tmp);
}
int i;
int flag=0;
for(i=0;i<N;i++){
if(pro.count(a_1[i])&&pro.count(a_2[i])){
printf("No\n");
flag=1;
}
}
if(!flag){
printf("Yes\n");
}
}
*/
}
二刷:
#include <iostream>
#include <cstdio>
#include <map>
#include <set>
using namespace std;
const int maxn=10010;
int a[maxn];
int main()
{
int N,M;
scanf("%d%d",&N,&M);
map<int,set<int> > m1;
map<int,set<int> > m2;
for(int i=0;i<N;i++){
int a,b;
scanf("%d%d",&a,&b);
m1[a].insert(b);
m2[b].insert(a);
}
for(int i=0;i<M;i++){
int tmp_num;
scanf("%d",&tmp_num);
for(int i=0;i<tmp_num;i++)
scanf("%d",&a[i]);
bool flag=true;
for(int i=0;i<tmp_num;i++){
for(int j=i+1;j<tmp_num;j++){
if(m1[a[i]].find(a[j])!=m1[a[i]].end()
||m2[a[j]].find(a[i])!=m2[a[j]].end()){
flag=false;
break;
}
}
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}