题意
给出一个无向图, n个顶点(顶点id从1开始), m条边.
输入k组顶点集, 判断是否为Hamiltonian cycle.
Hamiltonian cycle: a simple cycle that contains every vertex in a graph.
思路
判断Hamiltonian cycle:
- 该顶点集一定包含n+1个顶点
- 首尾一定相等
- 连通性检查
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 1
Sample Output:
YES
NO
NO
NO
YES
NO
#include "bits/stdc++.h"
using namespace std;
const int N = 210;
int G[N][N];
int main(){
// freopen("input.txt","r",stdin);
int n, m; cin >> n >> m;
for (int i = 0; i < m; ++i) {
int a, b; scanf("%d%d",&a,&b);
G[a][b] = G[b][a] = 1;
}
int k; cin >> k;
for (int i = 0; i < k; ++i) {
int num; scanf("%d",&num);
if (num != n+1) {
printf("NO\n");
string s; getline(cin,s);
continue;
}
vector<int> a(num);
set<int> cnt;
for (int j = 0; j < num; ++j) scanf("%d",&a[j]),cnt.insert(a[j]);
if (a.back() != a.front() || cnt.size() != n) {
printf("NO\n");
continue;
}
bool ok = true;
for (int j = 1; j < num; ++j) {
if (!G[a[j]][a[j-1]]) {
ok = false;
break;
}
}
if (ok) printf("YES\n");
else printf("NO\n");
}
}