分析:
哈密顿回路:从起点出发,每个点走一遍,恰好回到起点
哈密顿回路需要满足的条件:
- 判断起点终点是否相同
- 路径连通(过程中每两个点之间都有边)
- 所有点都会访问一遍
- 所有点数和为n+1
通过代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 210;
int n, m;
bool g[N][N], st[N];
int nodes[N * 2];
bool check(int cnt)
{
//若起点和终点不相等,或者总点数不为n+1,则返回false
if (nodes[0] != nodes[cnt - 1] || cnt != n + 1)
return false;
//遍历每个点,走到的点标记,若相邻的两个点之间不连通则返回false
memset(st, 0, sizeof st);
for (int i = 0; i < cnt - 1; i ++ )
{
st[nodes[i]] = true;
if (!g[nodes[i]][nodes[i + 1]])
return false;
}
//判断每一个点是否都走到
for (int i = 1; i <= n; i ++ )
if (!st[i])
return false;
return true;
}
int main()
{
cin >> n >> m;
while (m -- )
{
int a, b;
cin >> a >> b;
g[a][b] = g[b][a] = true;
}
int k;
cin >> k;
while (k -- )
{
int cnt;
cin >> cnt;
for (int i = 0; i < cnt; i ++ ) cin >> nodes[i];
if (check(cnt)) puts("YES");
else puts("NO");
}
return 0;
}