一、题目概述
依据给定边构造无向图,检测给出的路径是否构成Hamilton环。
二、思路
由Hamilton环的定义:
1、是简单环(路径),即:
(1)该环存在(可沿给定环遍历)
(2)除首尾顶点相同,路径上顶点不重复。
2、该环包含了所有顶点,即n - 1 == N。
三、代码
#include <cstdio>
#include <vector>
using namespace std;
int main()
{
int N, M, K;
scanf("%d %d", &N, &M);
vector<vector<bool>> G(N + 1, vector<bool>(N + 1, false));
for(int i = 0, v1, v2; i < M; ++i)
{
scanf("%d %d", &v1, &v2);
G[v1][v2] = G[v2][v1] = true;
}
scanf("%d", &K);
for(int i = 0, n, flag; i < K; ++i)
{
scanf("%d", &n);
vector<int> a(n), visited(N + 1, 0);
for(int j = 0; j < n; ++j)
scanf("%d", &a[j]);
flag = (n == N + 1 && a.front() == a.back());
for(int j = 1; j < n && flag; ++j)
if(visited[a[j]] || !G[a[j - 1]][a[j]])
flag = 0;
else visited[a[j]] = 1;
printf("%s\n", flag ? "YES":"NO");
}
}