用C语言DFS的方式实现欧拉图的判定并输出所有欧拉图
时间: 2024-03-18 22:38:49 浏览: 365
好的,下面是用C语言实现欧拉图的判定并输出所有欧拉图的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100 // 最大顶点数
int graph[MAXN][MAXN]; // 图的邻接矩阵
int degree[MAXN]; // 各顶点的度数
int n; // 顶点数
void dfs(int u, int* euler, int* cnt) {
for (int v = 0; v < n; v++) {
if (graph[u][v]) { // 存在从u到v的边
graph[u][v] = graph[v][u] = 0; // 将该边删除
dfs(v, euler, cnt); // 递归访问v
}
}
euler[(*cnt)++] = u; // 将u加入欧拉回路序列
}
void euler_dfs() {
int euler[MAXN]; // 存储欧拉回路的顶点序列
int cnt = 0; // 当前欧拉回路序列中的顶点数
dfs(0, euler, &cnt); // 从顶点0开始遍历
printf("欧拉回路序列为:\n");
for (int i = cnt - 1; i >= 0; i--) {
printf("%d ", euler[i]); // 输出欧拉回路序列
}
printf("\n");
}
int is_euler_graph() {
for (int i = 0; i < n; i++) {
if (degree[i] % 2 != 0) { // 存在度数为奇数的顶点
return 0; // 不是欧拉图
}
}
euler_dfs(); // 输出所有欧拉回路
return 1; // 是欧拉图
}
int main() {
printf("请输入图的顶点数和边数:\n");
scanf("%d", &n);
int m;
scanf("%d", &m);
printf("请输入各边的两个端点:\n");
for (int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
graph[u][v] = graph[v][u] = 1; // 添加无向边
degree[u]++; // 更新各顶点的度数
degree[v]++;
}
if (is_euler_graph()) {
printf("该图是欧拉图!\n");
} else {
printf("该图不是欧拉图!\n");
}
return 0;
}
```
在这个示例代码中,我们用邻接矩阵存储无向图,并用degree数组记录各顶点的度数。在判断图是否为欧拉图时,我们首先遍历各顶点,如果有度数为奇数的顶点,则不是欧拉图;否则,我们调用euler_dfs函数输出所有欧拉回路。在euler_dfs函数中,我们从任意一个顶点开始进行DFS遍历,并在访问每条边时将其删除,同时将经过的顶点加入欧拉回路序列中。最后,我们将欧拉回路序列倒序输出即可。
希望这个示例代码能够帮助你理解如何用C语言实现欧拉图的判定和输出所有欧拉图。
阅读全文