1122. Hamiltonian Cycle (25)
The "Hamilton cycle problem" is to find a simple cycle that contains every vertex in a graph. Such a cycle is called a "Hamiltonian cycle".
In this problem, you are supposed to tell if a given cycle is a Hamiltonian cycle.
Input Specification:
Each input file contains one test case. For each case, the first line contains 2 positive integers N (2< N <= 200), the number of vertices, and M, the number of edges in an undirected graph. Then M lines follow, each describes an edge in the format "Vertex1 Vertex2", where the vertices are numbered from 1 to N. The next line gives a positive integer K which is the number of queries, followed by K lines of queries, each in the format:
n V1 V2 ... Vn
where n is the number of vertices in the list, and Vi's are the vertices on a path.
Output Specification:
For each query, print in a line "YES" if the path does form a Hamiltonian cycle, or "NO" if not.
Sample Input:6 10 6 2 3 4 1 5 2 5 3 1 4 1 1 6 6 3 1 2 4 5 6 7 5 1 4 3 6 2 5 6 5 1 4 3 6 2 9 6 2 1 6 3 4 5 2 6 4 1 2 5 1 7 6 1 3 4 5 2 6 7 6 1 2 5 4 3 1Sample Output:
YES NO NO NO YES NO
题意:有n个点,m条边,q次询问,给出一个走的序列,问是不是哈密顿圈,哈密顿圈满足:序列首尾相同,序列长度 = 顶点个数 + 1,除首尾外,不会再有相同的顶点,序列中相邻的两个顶点要求有边相连。
解题思路:水题,所有条件判一下就好,不过题目数据好像有点怪,我数组205的有一个点过不了,2050就过了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
#include <cmath>
#include <set>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <functional>
using namespace std;
#define LL long long
const int INF = 0x3f3f3f3f;
int n, m, q, k, a[2050];
int edge[2050][2050], visit[2050];
int main()
{
scanf("%d%d", &n, &m);
int u, v;
memset(edge, 0, sizeof edge);
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &u, &v);
edge[u][v] = edge[v][u] = 1;
}
scanf("%d", &q);
while (q--)
{
memset(visit, 0, sizeof visit);
scanf("%d", &k);
int cnt = 0, flag = 1;
for (int i = 1; i <= k; i++)
{
scanf("%d", &a[i]);
if (!visit[a[i]]) visit[a[i]] = 1, cnt++;
}
if (a[1] != a[k] || cnt != n || k != (n + 1)) flag = 0;
for (int i = 2; i <= k; i++)
if (!edge[a[i - 1]][a[i]]) flag = 0;
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}