📅  最后修改于: 2023-12-03 14:51:32.295000             🧑  作者: Mango
深度优先搜索(DFS)是一种经典的图遍历算法。在一个无向图中,它会从一个未被访问的节点开始,沿着一条边遍历到一个未被访问的节点,而且总是尽可能地深入每个未被访问的节点。所以,在深度优先搜索中,一个节点被访问后,一直沿着它的一个邻接节点向下探索,直到不能再深入,然后返回到刚刚访问过的节点,继续搜索下一个未被访问的邻接节点。
在给定图中使用邻接矩阵实现 DFS 遍历的 C 程序,涉及的代码实现如下:
#include <stdio.h>
#define MAX 10
int visited[MAX] = {0};
int adjMatrix[MAX][MAX];
void DFS(int vertex) {
visited[vertex] = 1;
printf("%d ", vertex);
for (int i = 0; i < MAX; i++) {
if (adjMatrix[vertex][i] == 1 && visited[i] == 0) {
DFS(i);
}
}
}
int main() {
int n;
printf("Enter the number of nodes in the graph: ");
scanf("%d", &n);
printf("Enter the adjacency matrix of the graph: \n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &adjMatrix[i][j]);
}
}
printf("The DFS traversal of the graph starting from node 0 is: ");
DFS(0);
return 0;
}
这段代码实现了邻接矩阵存储法的 DFS 遍历。其中,邻接矩阵 adjMatrix
用 0
和 1
表示各个节点之间是否有边相连;visited
数组用于标记每个节点是否已经被访问过。遍历的过程中,从起点开始,递归访问所有与起点相连的未被访问的节点,直到所有节点都被访问过。
除此之外,我们还可以对程序做一些优化。由于邻接矩阵是一个对称矩阵,我们可以只遍历对角线及其右侧的元素,加快遍历速度。同时,可以将遍历代码封装成一个函数,提高代码的可读性和复用性。更新后的代码如下:
#include <stdio.h>
#define MAX 10
int visited[MAX] = {0};
int adjMatrix[MAX][MAX];
void DFS(int vertex);
int main() {
int n;
printf("Enter the number of nodes in the graph: ");
scanf("%d", &n);
printf("Enter the adjacency matrix of the graph: \n");
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
scanf("%d", &adjMatrix[i][j]);
adjMatrix[j][i] = adjMatrix[i][j];
}
}
printf("The DFS traversal of the graph starting from node 0 is: ");
DFS(0);
return 0;
}
void DFS(int vertex) {
visited[vertex] = 1;
printf("%d ", vertex);
for (int i = 0; i < MAX; i++) {
if (adjMatrix[vertex][i] == 1 && visited[i] == 0) {
DFS(i);
}
}
}
在这份更新后的代码中,我们将遍历过程封装成了一个名为 DFS
的函数,它接收一个整数参数 vertex
,表示起点。邻接矩阵的读入方式从原来的遍历全部元素改为遍历对角线及其右侧的元素,并复制到对称位置。这样,我们就可以去除重复的遍历,提高算法效率。