判断给定路径是否为哈密顿回路。
哈密顿回路是一个包含图中每个顶点的简单回路
将给定序列先根据哈密顿回路性质(顶点数是否一致,是否回到起点)判断
再通过遍历判断是否连通 以及确保每个点都在图中
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=3000+5;
int n,m;
int d[N][N],v[N];
int vis[N];
bool check(int cnt){
if(cnt!=n) return false;
if(v[0]!=v[cnt]) return false;
memset(vis,0,sizeof(vis));
rep(i,0,cnt){
vis[v[i]]=1;
if(!d[v[i]][v[i+1]])return false;
}
rep(i,1,n+1){
if(!vis[i]) return false;
}
return true;
}
int main(){
cin>>n>>m;
while(m--){
int a,b;cin>>a>>b;
d[a][b]=d[b][a]=1;
}
int k;cin>>k;
while(k--){
int cnt;cin>>cnt;
rep(i,0,cnt) cin>>v[i];
if(check(cnt-1)) puts("YES");
else puts("NO");
}
}