PAT 1122. Hamiltonian Cycle (25) 哈密尔顿环序列判断——看懂题意比啥都重要

/*************************
题意:
给一个图
再给一组数字的序列
问是否构成哈密尔顿回路序列
该序列要求:
	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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值