判断一个图是不是,如果是,求出所有欧拉路,求C语言的代码
时间: 2024-03-17 19:43:50 浏览: 67
以下是一个简单的 C 语言程序,用于判断一个图是否为欧拉图,并找到所有欧拉路。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 1000
#define MAXE 100000
typedef struct {
int u, v; // 边的两个端点
int w; // 边的权值(如果有的话)
} Edge;
Edge edges[MAXE];
int degree[MAXV]; // 存储每个节点的度数
int adj[MAXV][MAXV]; // 邻接矩阵
int visited[MAXE]; // 存储是否访问过该边
// 深度优先遍历
void dfs(int u) {
int v;
for (v = 0; v < MAXV; v++) {
if (adj[u][v] && !visited[adj[u][v]]) {
visited[adj[u][v]] = 1;
dfs(v);
}
}
}
int main() {
int n, m, i, j, k, u, v, cnt = 0;
scanf("%d%d", &n, &m);
for (i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
edges[i].u = u;
edges[i].v = v;
degree[u]++;
degree[v]++;
adj[u][v] = adj[v][u] = i;
}
// 判断是否为欧拉图
for (i = 1; i <= n; i++) {
if (degree[i] % 2 != 0) {
printf("Not Eulerian\n");
return 0;
}
}
// 找出所有欧拉路
for (i = 0; i < m; i++) {
if (!visited[i]) {
visited[i] = 1;
dfs(edges[i].u);
for (j = 0; j < m; j++) {
if (!visited[j] && degree[edges[j].u] % 2 == 0 && degree[edges[j].v] % 2 == 0) {
visited[j] = 1;
dfs(edges[j].u);
i = j - 1;
break;
}
}
printf("Eulerian Path %d: ", ++cnt);
for (k = 0; k < m; k++) {
if (visited[k]) {
printf("(%d,%d) ", edges[k].u, edges[k].v);
}
}
printf("\n");
}
}
return 0;
}
```
在这个程序中,我们首先使用邻接矩阵存储图中的边和每个顶点的度数。然后,我们遍历所有顶点,如果存在度数为奇数的顶点,则该图不是欧拉图。
接下来,我们使用深度优先遍历找到所有欧拉路。我们从第一条没有访问过的边开始,遍历图中所有与之相连的边,直到无法继续遍历。然后,我们遍历所有未访问过的边,找到第一条起点和终点度数均为偶数的边,重复上述过程,直到所有边都被遍历过。
最后,我们输出每个欧拉路所经过的边。
阅读全文