题目链接
代码中有注释,容易理解;
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#pragma warning(disable:4996);
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stack>
#include<math.h>
#include<vector>
using namespace std;
struct wu {
int wu1;
int wu2;
}w[100000];//来记录不相容的一对货物
int main() {
int n, m;
scanf("%d%d", &n, &m);
int e;
int c[100010] = { 0 };//记录每个货物不相容的个数;
for (int i = 0;i < n;i++)
{
int a, b;
scanf("%d%d", &a, &b);
c[a]++;
c[b]++;
w[i].wu1 = a;//关联违禁物;
w[i].wu2 = b;
}
for (int i = 0;i < m;i++)
{
int k;//物品件数
scanf("%d", &k);
int flag = 0;//标志位,判断有没有违禁的,有则直接退出;
int b[100010] = { 0 };//这单货物中不能一块放的东西;
for (int j = 0;j < k;j++)
{
int d;
scanf("%d", &d);
if (flag == 1) {
continue;
}//确定此单货物有违禁退出循环;
else if (b[d] == 1) {
flag = 1;
continue;
}
else if (c[d] != 0)//如果这个物品有对应的不能一起放的违禁物
{
e = c[d];//记录C[d]的初值,便于还原;
for(int s = 0;s < n;s++)//寻找不能被一起放的有哪些
{
if (d == w[s].wu1) {
b[w[s].wu2] = 1;//记录他的对应的违禁物
c[d]--;//此时他所对应的违禁物个数-1;
}
else if (d == w[s].wu2)
{
b[w[s].wu1] = 1;
c[d]--;
}
if (c[d] == 0) {
break;//这个物品对应的违禁物已全部找完;
}
}
c[d] = e;
}
}
if (flag == 1) {
printf("No\n");
}
else {
printf("Yes\n");
}
}
return 0;
}