题意:给定一个图,判断是否是一个Hamilton cycle,即所有节点仅此访问一次
思路:不是此环有几种情况:
1.任意相邻的两顶点不可达,
2.没有访问到所有的顶点,
3.最前面一个点与最后面一个点不相同,
4.除了第一个节点外还有多个节点访问次数不止一次。
设置两个标志量,分别判断上面几种情况,用vector数组保存所有的顶点集合,set数组保存所有访问点的集合,还有就是如果把这些放到函数里面实现,运行时间比放在主函数执行低一倍的效率,放在check函数时运行77ms,放在主函数44ms
代码:
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int graph[210][210], n = 0,m = 0,k = 0, cnt = 0;
int main() {
cin >> n >> m;
for (int i = 0; i < m; i++) {
int x = 0, y = 0;
scanf("%d%d",&x,&y);
graph[x][y] = graph[y][x] = 1;
}
cin >> k;
while (k--) {
int flag1 = 1, flag2 = 1;
scanf("%d", &cnt);
set<int> s;
vector<int> p(cnt);
for (int i = 0; i < cnt; i++) {
scanf("%d", &p[i]);
s.insert(p[i]);
}
for (int i = 0; i < p.size() - 1; i++) {
if (graph[p[i]][p[i + 1]] == 0) flag1 = 0;
}
if (s.size() < n || p[0] != p[p.size() - 1] || p.size() - 1 != n) flag2 = 0;//检查访问到所有点,是否构成回路,是否存在除第一个点外多次访问的情况
printf("%s\n", flag1&&flag2 == 1 ? "YES" : "NO");
}
system("pause");
return 0;
}