/*************************
题意:
给一个图
再给一组数字的序列
问是否构成哈密尔顿回路序列
该序列要求:
1. 该序列首尾相连,即第一个点等于最后一个点。
2. 除了首=尾外,其他地方不能有重复出现的点。
3. 该序列中的点 必须包括 图中所有点
4. 该序列每个相连点必须在图上也相连。
************************/
/***********************
解题思路:
看懂上面的要求即可做了。。。
*************************/
/***********************
注意
遇到这种5位id的输出时,一定要记住补0!!!
*********************/
#include<iostream>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
using namespace std;
#define M 205
#define INF 0x7ffffff
int link[M][M];
int vis[M];
int main(){
int n, i, m,a,b,k,j,node;
cin>>n>>m;
memset(link,0,sizeof(link));
while(m--){
cin>>a>>b;
link[a][b] = 1;
link[b][a] = 1;
}
int noden, last,flag;
cin>>k;
while(k--){
cin>>m;
memset(vis,0,sizeof(vis));
noden = n;
last = -1;
flag = 1;
int head;
while(m--){
cin>>a;
if(last != -1 && link[last][a] == 0) //无法连接
flag = 0;
if(last == -1) //说明是头点
head = a;
if(vis[a] == 0){
vis[a] = 1;
noden--;
}else {
if(a != head){ //除了头以外不可重复出现
flag = 0;
}else if(m != 0){ //这个头节点不是最后一个点
flag = 0;
}
}
last = a;
}
if(flag == 0 || noden != 0 || a!= head) //未包含所有点,并非首尾相连
cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
PAT 1122. Hamiltonian Cycle (25) 哈密尔顿环序列判断——看懂题意比啥都重要
最新推荐文章于 2022-11-19 15:31:31 发布