基础实验6-2.2 汉密尔顿回路
分数 25
全屏浏览
切换布局
作者 陈越
单位 浙江大学
著名的“汉密尔顿(Hamilton)回路问题”是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次)。本题就要求你判断任一给定的回路是否汉密尔顿回路。
输入格式:
首先第一行给出两个正整数:无向图中顶点数 n(2<n≤200)和边数 m。随后 m 行,每行给出一条边的两个端点,格式为“顶点1 顶点2”,其中顶点从 1 到 n 编号。再下一行给出一个正整数 k,是待检验的回路的条数。随后 k 行,每行给出一条待检回路,格式为:
nv v1 v2 ⋯ vn
其中 nv 是回路中的顶点数,vi 是路径上的顶点编号。
输出格式:
对每条待检回路,如果是汉密尔顿回路,就在一行中输出 YES
,否则输出 NO
。
输入样例:
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
输出样例:
YES
NO
NO
NO
YES
NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
// 2024/11/27 OK
#include <bits/stdc++.h>
using namespace std;
int n, m, k, flag;
int g[205][205];
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i ++)
{
int a, b;
cin >> a >> b;
g[a][b] = g[b][a] = 1;
}
cin >> k;
for (int i = 1; i <= k; i ++)
{
int nv, flag = 0;
cin >> nv;
vector<int> v;
map<int, int> mp;
for (int j = 1; j <= nv; j ++) {
int tmp;
cin >> tmp;
v.push_back(tmp);
}
if (nv != n + 1 || v.front() != v.back()) {
flag = 1;
}
for (int j = nv; j > 1; j --) {
int b = v.back(); v.pop_back();
int a = v.back();
if (!g[a][b]) {
flag = 1;
break;
}
mp[b] ++;
}
for (auto& t: mp) {
if (t.second != 1) {
flag = 1;
break;
}
}
if (!flag) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
return 0;
}