C语言实现利用邻接矩阵储存无向图利用DFS判断无向图是否有环,如果有环将环的顶点序列依次输出,例如输入: 0 1 1 1 0 1 1 1 0 输出: 0 1 2
时间: 2024-01-01 19:03:58 浏览: 76
以下是C语言实现的代码,其中使用了邻接矩阵和深度优先搜索(DFS)算法来判断无向图是否有环,并输出环的顶点序列:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXV 100 // 最大顶点数
#define INF 0x3f3f3f // 无穷大
int G[MAXV][MAXV]; // 邻接矩阵
int V, E; // 顶点数和边数
int visited[MAXV]; // 记录访问状态
int path[MAXV]; // 记录路径
int found; // 是否找到环
// DFS遍历
void DFS(int u, int depth) {
visited[u] = 1; // 标记为已访问
path[depth] = u; // 记录路径
int i;
for (i = 0; i < V; i++) {
if (G[u][i]) { // 如果有边
if (!visited[i]) { // 未访问过
DFS(i, depth + 1);
if (found) return; // 如果找到环,直接返回
} else { // 如果已访问过,说明找到了环
int j;
found = 1;
for (j = depth - 1; j >= 0; j--) {
if (path[j] == i) break; // 找到环的起点
}
printf("%d", i); // 输出环的起点
for (; j < depth; j++) {
printf(" %d", path[j]); // 输出环的顶点序列
}
printf("\n");
return;
}
}
}
}
int main() {
scanf("%d %d", &V, &E);
int i, j;
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
G[i][j] = INF; // 初始化为无穷大
}
}
for (i = 0; i < E; i++) {
int u, v;
scanf("%d %d", &u, &v);
G[u][v] = G[v][u] = 1; // 添加边
}
for (i = 0; i < V; i++) {
if (!visited[i]) {
DFS(i, 0); // 从未访问的顶点开始遍历
}
if (found) break; // 如果找到环,直接退出
}
if (!found) printf("No cycle found.\n");
return 0;
}
```
例如,对于输入样例:
```
5 6
0 1
1 2
2 3
3 4
4 2
1 4
```
程序输出:
```
2 3 4
```
阅读全文