PAT甲级1149
题目大意:给出n组不相容的数据,接下来给出m条待查数据,问每组数据是否可以共存。
由于数据比较大所以用邻接表存储不相容的节点,如果碰到某个节点其不相容节点0个则直接跳过(说明该节点一定可以放进箱子里),否则从他的不相容邻接点查找看是否有和后面待查数据相同的,如果有则记录flag为false,之后只录入数据不做任何处理(只要有一组不相容别的都不用看了)。虽然数据有些大但是可以通过一些条件跳过大量冗余循环。
#include <iostream>
#include <vector>
#include <algorithm>
#define MAXN 100005
using namespace std;
int n,m;
vector<int> incompatible[MAXN];
bool canBeSame(vector<int> query){
bool flag;
for(int i=0;i<query.size()-1;i++){
int start=query[i];
flag=true;
if(incompatible[start].size()!=0){ //只有商品有不兼容的商品时才遍历否则考虑下一个商品
for(int j=i+1;j<query.size();j++){
if(find(incompatible[start].begin(),incompatible[start].end(),query[j])!=incompatible[start].end()){ //只要找到一个不兼容的商品即跳出
flag=false;
break;
}
}
}
if(flag==false) break;
}
return flag;
}
int main(){
int goods1,goods2,k,tmpgoods;
scanf("%d%d",&n,&m);
vector<int> query;
for(int i=0;i<n;i++){
scanf("%d%d",&goods1,&goods2);
incompatible[goods1].push_back(goods2);
incompatible[goods2].push_back(goods1);
}
for(int i=0;i<m;i++){
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%d",&tmpgoods);
query.push_back(tmpgoods);
}
if(canBeSame(query)) printf("Yes\n");
else printf("No\n");
query.clear();
}
system("pause");
return 0;
}