C语言实现利用DFS判断无向图是否有环,如果有环将环的顶点序列依次输出,例如输入: 0 1 1 1 0 1 1 1 0 输出: 0 1 2
时间: 2024-01-01 10:03:57 浏览: 116
C语言 输入无向图连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始点序号,输出深度优先遍历序列
5星 · 资源好评率100%
好的,根据你的要求,我可以给出以下C语言代码实现:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 1000
int n, m;
int g[MAX_N][MAX_N];
bool vis[MAX_N], flag = false;
int path[MAX_N], top = 0; // 记录环的路径
void dfs(int u, int pre) {
vis[u] = true;
path[++top] = u;
for (int v = 0; v < n; ++v) {
if (v == pre || g[u][v] == 0) continue; // 不往回搜,不搜索非连通的点
if (vis[v]) { // 发现环
flag = true;
printf("环的顶点序列:");
for (int i = top; i >= 1; --i) {
printf("%d ", path[i]);
if (path[i] == v) break;
}
printf("%d\n", v);
return;
}
dfs(v, u);
if (flag) return; // 找到环就直接退出
}
top--; // 回溯
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v;
scanf("%d%d", &u, &v);
g[u][v] = g[v][u] = 1;
}
for (int i = 0; i < n; ++i)
if (!vis[i])
dfs(i, -1);
if (!flag)
printf("该无向图没有环!\n");
return 0;
}
```
这段代码同样使用了 DFS 来判断无向图是否有环,如果有,则输出环的顶点序列。
代码实现的思路:
1. 使用邻接矩阵存储无向图;
2. 对于每个连通块,从未访问的节点开始 DFS,如果发现节点已经被访问过,说明出现了环;
3. 在 DFS 的过程中,记录路径,如果发现环,就输出路径中环的部分。
希望这个回答能够回答你的问题!
阅读全文