题目大意
给定一个无向图,判断查询的路径是否是一个哈密顿圈。
算法思路
判断一条路径是一个哈密顿圈的方法为
- 1、除了首尾节点其他节点没有重复,不重复的节点数目等于N
- 2、首节点只能重复一次,所有节点数目为N+1
- 3、首尾节点得相等
- 4、任意两点之间连通
在输入每一条路径的时候,首先判断输入节点与上一个输入节点是否连通,如果不是设置flag为false.然后统计节点数目cnt,并将节点添加进set集合s中,只要s.size()!=n||cnt!=n+1||!flag||start!=End
,就说明该路径不是哈密顿圈,输出NO,否则输出YES。
提交结果
AC代码
#include<cstdio>
#include<unordered_set>
#include<set>
#include<vector>
using namespace std;
int G[205][205];
int main() {
int n, m;
scanf("%d %d", &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;
scanf("%d", &k);
for (int i = 0; i < k; ++i) {
int num;
scanf("%d", &num);
unordered_set<int> s;
// 起点,节点个数,终点
int start, cnt = 1, End = 0;
bool flag = true;// 路径是否连通
scanf("%d", &start);
int pre = start;
for (int j = 1; j < num; ++j) {
int v;
scanf("%d", &v);
if (G[pre][v] == 0) {
flag = false;
}
if (j == num - 1) {
End = v;
}
pre = v;
++cnt;
s.insert(v);
}
if (s.size() != n || cnt != n + 1 || !flag || start != End) {
printf("NO\n");
} else {
printf("YES\n");
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。