https://www.acwing.com/problem/content/description/1617/
思路:
需要满足:1. 第一个点和最后一个点相同,这样才能形成回路。
2.要有恰好有n+1个点,因为哈密顿回路本身就要求经过图中每个顶点。
3. 且每个顶点都必须遍历到。
4. 每两个点之间都要有边相连接。
#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)
{
if (nodes[0] != nodes[cnt - 1] || cnt != n + 1) return 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;
}
标签:cnt,哈密顿,int,cin,st,回路,nodes
From: https://www.cnblogs.com/xjtfate/p/16610779.html