著名的“汉密尔顿(Hamilton)回路问题”是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次)。本题就要求你判断任一给定的回路是否汉密尔顿回路。 输入格式: 首先第一行给出两个正整数:无向图中顶点数 N(2<N≤200)和边数 M。随后 M 行,每行给出一条边的两个端点,格式为“顶点1 顶点2”,其中顶点从 1 到N 编号。再下一行给出一个正整数 K,是待检验的回路的条数。随后 K 行,每行给出一条待检回路,格式为: n V 1 V 2 ⋯ V n 其中 n 是回路中的顶点数,V i 是路径上的顶点编号。 输出格式: 对每条待检回路,如果是汉密尔顿回路,就在一行中输出"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.使用c语言,二维数组编写代码
时间: 2024-01-03 21:03:52 浏览: 139
```c
#include <stdio.h>
#include <stdbool.h>
#define MAXN 210
int G[MAXN][MAXN]; // 图
bool vis[MAXN]; // 标记是否访问过
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = 1; // 无向图存储
}
int k;
scanf("%d", &k);
while (k--)
{
int len;
scanf("%d", &len);
int path[MAXN]; // 存储路径
for (int i = 0; i < len; i++)
{
scanf("%d", &path[i]);
}
// 判断路径是否为汉密尔顿回路
if (len != n || path[0] != path[len-1]) // 路径长度不为n或路径首尾不相连,不是汉密尔顿回路
{
printf("NO\n");
continue;
}
// 检查路径是否经过所有顶点
bool flag = true;
for (int i = 0; i < len-1; i++)
{
if (!G[path[i]][path[i+1]]) // 路径中有一条边不存在,不是汉密尔顿回路
{
flag = false;
break;
}
}
if (flag)
{
// 检查是否存在重复访问的顶点
for (int i = 1; i < len-1; i++) // 路径首尾顶点不重复
{
if (vis[path[i]]) // 重复访问的顶点
{
flag = false;
break;
}
vis[path[i]] = true;
}
}
if (flag)
printf("YES\n");
else
printf("NO\n");
// 清空标记
for (int i = 1; i <= n; i++)
vis[i] = false;
}
return 0;
}
```
阅读全文