c语言 无向图的环路径输出
时间: 2023-12-13 08:05:57 浏览: 61
要输出无向图的所有环路径,可以使用深度优先搜索(DFS)算法。具体步骤如下:
1. 定义一个数组 visited[] 来记录每个节点是否已经被访问过,初始化为 false。
2. 从每个未访问过的节点开始,递归遍历其所有邻居节点,如果邻居节点已经被访问过,则判断是否形成了环路径。如果形成了环路径,则输出路径。
3. 为了避免重复输出环路径,可以将每个节点的访问状态分为三种:未访问过、正在访问中、已经访问过。在递归遍历每个节点时,如果该节点的状态为“正在访问中”,则说明已经形成了环路径,可以直接输出路径。
以下是一个基于邻接表表示的无向图的环路径输出的 C 语言代码实现:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 100 // 最大节点数
#define MAX_M 1000 // 最大边数
int head[MAX_N]; // 邻接表头
int nxt[MAX_M]; // 邻接表中的下一个节点
int ver[MAX_M]; // 邻接表中的邻居节点
int tot; // 边数
bool visited[MAX_N]; // 节点访问状态
int path[MAX_N]; // 存储路径
void add_edge(int x, int y) {
ver[++tot] = y;
nxt[tot] = head[x];
head[x] = tot;
}
void dfs(int u, int depth) {
visited[u] = true;
path[depth] = u;
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (!visited[v]) {
dfs(v, depth + 1);
} else if (visited[v] && depth > 1 && path[depth - 2] != v) {
// 如果发现已经访问过的节点,并且形成了环路径
printf("环路径:");
for (int j = depth - 1; j >= 0; --j) {
printf("%d ", path[j]);
if (path[j] == v) break;
}
printf("\n");
}
}
visited[u] = false;
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; ++i) {
int x, y;
scanf("%d %d", &x, &y);
add_edge(x, y);
add_edge(y, x); // 无向图需要双向边
}
for (int i = 1; i <= n; ++i) {
dfs(i, 0);
}
return 0;
}
```
在上述代码中,head[] 数组表示邻接表头,nxt[] 和 ver[] 数组分别表示邻接表中的下一个节点和邻居节点。visited[] 数组表示每个节点的访问状态,path[] 数组用于存储路径。add_edge() 函数用于添加边,dfs() 函数用于进行深度优先搜索。在 dfs() 函数中,当遍历到已经访问过的节点并且形成了环路径时,就可以输出路径。
阅读全文