给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。
思路1:对每一组询问,遍历不相容的清单,看在集合中是否同时存在
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f;
#define x first
#define y second
using namespace std;
const int N=1e4+233;
int n,m,k;
pair<int,int>p[N];
unordered_set<int>s;
int main(){
cin>>n>>m;
rep(i,0,n) cin>>p[i].x>>p[i].y;
while(m--){
cin>>k;
s.clear();
while(k--) {
int a;
cin>>a;
s.insert(a);
}
int flag=1;
rep(i,0,n)
if(s.count(p[i].x)&&s.count(p[i].y)) flag=0;
if(flag) puts("Yes");
else puts("No");
}
}
思路2:
先对标号离散化,然后可以用二维数组代表所有物品之间的相容关系。对每一组询问之间,暴力每两个之间的关系。
但是不推荐这个思路,很麻烦
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f;
using namespace std;
const int N=1e5+233;
int n,m,k;
vector<int>c[N];
map<int,int>p;
int vis[N];
int a[N];
int cnt;
int main(){
cin>>n>>m;
rep(i,0,n) {
int s,t;
cin>>s>>t;
if(!p[s]) p[s]=++cnt;
if(!p[t]) p[t]=++cnt;
c[p[s]].push_back(p[t]);
c[p[t]].push_back(p[s]);
}
while(m--){
cin>>k;
memset(vis,0,sizeof(vis));
rep(i,0,k) {
cin>>a[i];
if(!p[a[i]]) p[a[i]]=++cnt;
vis[p[a[i]]] = 1;
}
int flag=1;
rep(i,0,k)
rep(j,0,c[p[a[i]]].size())
if(vis[c[p[a[i]]][j]]){
flag=0;break;
}
if(flag) puts("Yes");
else puts("No");
}
}