#include <bits/stdc++.h>
using namespace std;
const int maxn=10001;
vector<int>v[maxn];//临接表
bool visited[maxn]={false};
int n,m,k;
void dfs(int s)//对一个点进行深度遍历的具体描述
{
visited[s]=true;
if(v[s].size()==0)
return ;
for(int i=0;i<v[s].size();++i)//对s的了邻接点进行遍历
{
if(visited[v[s][i]]==false)
dfs(v[s][i]);
}
}
int depth()//对图进行深度遍历求深度
{
int cnt=0;
for(int i=1;i<=n;++i)
{
if(visited[i]==false)
{
dfs(i);
cnt++;
}
}
return cnt;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;++i)//把边与边之间的关系存起来
{
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
cin>>k;//k个方案
while(k--)
{
memset(visited,0,sizeof(visited));//初始化所有顶点都没有访问过
int cnt=0;//表示经过攻占得到的图的连通块的数量
int np;
cin>>np;
for(int i=0;i<np;++i)//
{
int city;
cin>>city;
visited[city]=true;
}
cnt=depth();
if(cnt+np==n)
{
cout<<"YES"<<endl;
}
else
cout<<"NO"<<endl;
}
}
https://pintia.cn/problem-sets/994805046380707840/problems/994805056195379200