#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 210;
int G[maxn][maxn];
int vis[maxn],q[maxn];
int main()
{
fill(G[0], G[0] + maxn * maxn, 0);
int n, m;
scanf("%d%d", &n, &m);
int a, b;
for (int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
G[a][b] = G[b][a] = 1;
}
int query, k;
scanf("%d", &query);
for (int i = 0; i < query; i++)
{
bool flag = 1;
scanf("%d", &k);
if (k != n + 1) flag = 0;
fill(vis, vis + maxn, 0);
scanf("%d", &q[0]);
for (int j = 1; j < k; j++)
{
scanf("%d", &q[j]);
vis[q[j]]++;
if (G[q[j - 1]][q[j]] == 0) flag = 0;
}
if (q[0] != q[k - 1]) flag = 0;
for (int j = 1; j < k; j++)
{
if (vis[j] != 1) flag = 0;
}
if (flag == 0) printf("NO\n");
else printf("YES\n");
}
return 0;
}
由于是一个图,所以只要保证所有点遍历一次即可(开始结尾的要一致),然后判断每次遍历的路径是否存在。