著名的“汉密尔顿(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"。用c语言,二维数组编写程序
时间: 2024-03-16 11:43:49 浏览: 65
以下是一个用 C 语言、二维数组实现的解法:
```c
#include <stdio.h>
#define MAX_N 200
int graph[MAX_N + 1][MAX_N + 1]; // 邻接矩阵表示图
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);
graph[u][v] = graph[v][u] = 1; // 标记无向边
}
int k;
scanf("%d", &k);
for (int i = 0; i < k; i++) {
int len, v[MAX_N + 1];
scanf("%d", &len);
for (int j = 0; j < len; j++) {
scanf("%d", &v[j]);
}
// 判断是否为汉密尔顿回路
if (len != n + 1 || v[0] != v[len - 1]) { // 长度不等于 n+1,或起点和终点不同
printf("NO\n");
} else {
int visited[MAX_N + 1] = {0}; // 标记每个顶点是否被访问过
visited[v[0]] = 1; // 标记起点已被访问
int j;
for (j = 1; j < len; j++) {
if (!graph[v[j - 1]][v[j]] || visited[v[j]]) { // 不是回路或顶点重复访问
printf("NO\n");
break;
}
visited[v[j]] = 1; // 标记当前顶点已被访问
}
if (j == len) { // 所有顶点都被访问过,且构成回路
printf("YES\n");
}
}
}
return 0;
}
```
该程序使用邻接矩阵表示图,并通过一个二维数组 `graph` 记录图中的边。对于每个待检验的回路,先判断其长度是否为 n+1(即图中顶点数加 1,因为回路起点和终点相同),且起点和终点是否相同;如果不满足这两个条件,则一定不是汉密尔顿回路。否则,从起点开始遍历路径,依次判断每条边是否存在(即判断是否为回路),以及每个顶点是否被访问过(即判断是否重复访问),如果满足条件,则是汉密尔顿回路。
阅读全文