思路:
把给定集合的每一个点标记,再判断每条边是否至少有一个点在给定的集合里面
通过代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
int n, m;
struct Edge
{
int a, b;
}e[N];
bool st[N];
int main()
{
cin >> n >> m;
for (int i = 0; i < m; i ++ ) cin >> e[i].a >> e[i].b;
int k;
cin >> k;
while (k -- )
{
int cnt;
cin >> cnt;
memset(st, 0, sizeof st);
while (cnt -- )
{
int x;
cin >> x;
st[x] = true;
}
int i;
for (i = 0; i < m; i ++ )
if (!st[e[i].a] && !st[e[i].b])
break;
if (i == m) puts("Yes");
else puts("No");
}
return 0;
}