题目大意:
现有N对互不兼容的物品清单和M个需要装箱的货物清单,询问每一个需要装箱的货物清单是否可以完全兼容并装箱,如果可以输出Yes,否则输出No。
算法思路:
首先使用$incompatible$二维数组存储每一个物体的所有不兼容的物体,并使用$incompat$数组记录当前货箱有哪些无法兼容的物品(为true即为不可兼容),然后在每一个需要装箱的货物进行依次装箱的时候,先检查当前物品是否与已经装箱的物品兼容,如果是,那么就将与该物品不兼容的所有物品的$incompat$记录为true,只要在装箱的时候出现一次$incompat$为true的情况,就说明该货物清单无法完全装箱,并使用$isCompatible$记录为false,否则为true,最后根据$isCompatible$进行输出Yes和No即可。
提交结果:
AC代码:
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int> incompatible[100000];// 每一个物品的所有不兼容的物体集合
bool incompat[100000];// 当前集装箱不可兼容的物体
int main(){
int N,M;
scanf("%d %d",&N,&M);
int a,b;
for (int i = 0; i < N; ++i) {
// N对互不兼容的物品
scanf("%d %d",&a,&b);
incompatible[a].push_back(b);
incompatible[b].push_back(a);
}
for (int i = 0; i < M; ++i) {
int num;
scanf("%d",&num);
memset(incompat,0, sizeof(incompat));
bool isCompatible = true;// 当前集装箱是否可以兼容所有物品
for (int j = 0; j < num; ++j) {
int index;
scanf("%d",&index);
if(!incompat[index]){
// 将index加入其中,并且将其不兼容的物品全部设置为true
for(auto &item:incompatible[index]){
incompat[item] = true;
}
} else {
isCompatible = false;// 这里不能break,因为得接受所有的输入数据
}
}
if(isCompatible){
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。