c语言编写程序,构造无向图的邻接矩阵基于邻接矩阵存储的DFS遍历算法,用户输入图的顶点数和边数,顶点序列,图中边的顶点对序列,遍历的起始顶点:,完整代码,算法思想
时间: 2024-03-25 17:37:55 浏览: 68
下面是基于邻接矩阵存储的DFS遍历算法的完整代码和算法思想:
算法思想:
邻接矩阵是表示图的常用方法之一,它可以通过一个二维数组`graph`来存储图的顶点和边。其中,`graph[i][j]`表示顶点i和顶点j之间是否有边,如果有,则为1,否则为0。
DFS遍历图的过程如下:
1. 从起始顶点开始,访问该顶点,并将其标记为已访问;
2. 对于当前顶点的每个邻接顶点,如果该邻接顶点未被访问,则递归访问该邻接顶点;
3. 重复步骤2,直到所有邻接顶点都被访问。
完整代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE][MAXSIZE]; // 邻接矩阵
int vertex_num; // 顶点数
int edge_num; // 边数
} Graph;
int visited[MAXSIZE]; // 标记数组
// 创建无向图
void create_graph(Graph *G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &G->vertex_num, &G->edge_num);
// 初始化邻接矩阵
for (int i = 0; i < G->vertex_num; i++) {
for (int j = 0; j < G->vertex_num; j++) {
G->data[i][j] = 0;
}
}
// 输入顶点序列
printf("请输入顶点序列:");
for (int i = 0; i < G->vertex_num; i++) {
scanf("%d", &visited[i]);
}
// 输入边的顶点对序列
printf("请输入边的顶点对序列:\n");
int u, v;
for (int i = 0; i < G->edge_num; i++) {
scanf("%d %d", &u, &v);
int x = -1, y = -1;
for (int j = 0; j < G->vertex_num; j++) {
if (visited[j] == u) {
x = j;
}
if (visited[j] == v) {
y = j;
}
}
if (x != -1 && y != -1) {
G->data[x][y] = 1;
G->data[y][x] = 1;
}
}
}
// DFS遍历图
void DFS(Graph G, int v) {
printf("%d ", visited[v]); // 访问顶点v
visited[v] = 1; // 标记顶点v为已访问
for (int i = 0; i < G.vertex_num; i++) {
if (G.data[v][i] == 1 && visited[i] == 0) { // 如果顶点i与v相邻且未被访问
DFS(G, i); // 递归访问顶点i
}
}
}
int main() {
Graph G;
create_graph(&G);
int v;
printf("请输入遍历的起始顶点:");
scanf("%d", &v);
printf("DFS遍历结果:");
DFS(G, v - 1);
printf("\n");
return 0;
}
```
在上面的代码中,我们首先定义了一个`Graph`结构体类型,包含一个二维数组`data`和两个整型变量`vertex_num`和`edge_num`,分别表示顶点数和边数。`visited`是一个标记数组,用于标记顶点是否已被访问。
`create_graph`函数用于创建无向图,其中,我们首先输入顶点数和边数,然后初始化邻接矩阵。接着,输入顶点序列和边的顶点对序列,并将边的信息存储到邻接矩阵中。
`DFS`函数用于DFS遍历图。我们首先访问起始顶点v,并将其标记为已访问。然后,对于每个与v相邻的顶点i,如果i未被访问,则递归访问i。最后输出DFS遍历结果。
在`main`函数中,我们调用`create_graph`函数创建无向图,并输入遍历的起始顶点。然后调用`DFS`函数进行DFS遍历,并输出遍历结果。
阅读全文