C语言完整实现实现利用邻接矩阵储存无向图利用DFS判断无向图是否有环,如果有环将环的顶点序列依次输出,要求直接输入邻接矩阵
时间: 2024-02-21 11:57:20 浏览: 85
邻接矩阵存储的无向网的基本操作(C语言实现)
好的,我可以为您解答这个问题。
首先,让我们来了解一下邻接矩阵的概念。邻接矩阵是一种常见的图的存储方式,它使用一个二维数组来表示图中各个节点之间的连接关系。对于一个无向图,邻接矩阵是一个对称矩阵,矩阵中的元素为1表示两个节点之间有边相连,为0则表示没有边相连。
接下来,我们可以使用深度优先搜索(DFS)算法来判断无向图是否有环,并输出环的顶点序列。具体步骤如下:
1. 定义一个数组visited,用于记录每个节点是否已被访问过,并初始化为0。
2. 定义一个数组path,用于存储当前搜索路径上的节点,初始为空。
3. 从任意一个未被访问过的节点开始,进行深度优先搜索。在搜索的过程中,如果发现一个节点已经被访问过了,并且它不是当前搜索路径上的最后一个节点(也就是说,存在一条边连接当前节点和已访问过的节点),那么说明图中存在环。此时,可以将环的顶点序列依次输出。
4. 继续对未被访问过的节点进行深度优先搜索,直到所有节点都被访问过为止。
下面是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_VERTEX_NUM 100
typedef struct {
int vertex[MAX_VERTEX_NUM];
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertex_num, edge_num;
} Graph;
bool visited[MAX_VERTEX_NUM];
int path[MAX_VERTEX_NUM];
int path_length;
void create_graph(Graph *g) {
printf("请输入顶点数和边数:");
scanf("%d%d", &g->vertex_num, &g->edge_num);
printf("请输入顶点信息:");
for (int i = 0; i < g->vertex_num; i++) {
scanf("%d", &g->vertex[i]);
}
for (int i = 0; i < g->vertex_num; i++) {
for (int j = 0; j < g->vertex_num; j++) {
g->edge[i][j] = 0;
}
}
printf("请输入边信息(格式:起点 终点):\n");
for (int i = 0; i < g->edge_num; i++) {
int start, end;
scanf("%d%d", &start, &end);
g->edge[start][end] = 1;
g->edge[end][start] = 1;
}
}
void dfs(Graph g, int v, int parent) {
visited[v] = true;
path[path_length++] = v;
for (int i = 0; i < g.vertex_num; i++) {
if (g.edge[v][i] == 1) {
if (!visited[i]) {
dfs(g, i, v);
} else if (i != parent) {
printf("图中存在环:");
for (int j = path_length - 1; j >= 0; j--) {
printf("%d ", path[j]);
if (path[j] == i) {
break;
}
}
printf("\n");
}
}
}
path_length--;
visited[v] = false;
}
int main() {
Graph g;
create_graph(&g);
printf("图的邻接矩阵为:\n");
for (int i = 0; i < g.vertex_num; i++) {
for (int j = 0; j < g.vertex_num; j++) {
printf("%d ", g.edge[i][j]);
}
printf("\n");
}
printf("图中是否存在环:\n");
for (int i = 0; i < g.vertex_num; i++) {
visited[i] = false;
}
path_length = 0;
for (int i = 0; i < g.vertex_num; i++) {
if (!visited[i]) {
dfs(g, i, -1);
}
}
return 0;
}
```
在代码中,我们首先定义了一个Graph结构体,用于存储图的信息。然后,我们通过create_graph函数读入邻接矩阵,并打印出来。接着,我们使用dfs函数进行深度优先搜索,判断图中是否存在环,并输出环的顶点序列。
在dfs函数中,我们首先将当前节点标记为已访问,并将它加入到当前搜索路径中。然后,我们遍历所有与当前节点相邻的节点,如果某个节点未被访问过,就递归调用dfs函数进行搜索。如果某个节点已经被访问过,并且它不是当前搜索路径上的最后一个节点,就说明图中存在环。此时,我们可以将环的顶点序列依次输出。最后,我们将当前节点从搜索路径中移除,并将它的访问状态标记为未访问。
希望我的回答能够帮到您!
阅读全文