一开始以为是图的遍历,但后来才发现不用DFS,直接看这个路径是否合法就可以
因为是遍历所有节点,因此合法的环路径必须是n+1个节点且头尾相同,而且全部节点都要出现,最后检查这个路径是否连通
#include<bits/stdc++.h>
using namespace std;
const int maxn=500;
int G[maxn][maxn],n,m;
bool vis[maxn];
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int v1,v2;
scanf("%d%d",&v1,&v2);
G[v1][v2]=G[v2][v1]=1;
}
int k;
scanf("%d",&k);
while(k--)
{
int a[maxn],cnt;
scanf("%d",&cnt);
bool f=true;
memset(vis,false,sizeof(vis));
for(int i=0;i<cnt;i++)scanf("%d",&a[i]),vis[a[i]]=true;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
f=false;
break;
}
}
for(int i=1;i<cnt;i++)
{
int v=a[i-1],u=a[i];
if(G[v][u]==0)
{
f=false;
break;
}
}
if(cnt!=n+1||a[0]!=a[cnt-1]||f==false)printf("NO\n");
else printf("YES\n");
}
return 0;
}