给定一个图,使用邻接矩阵实现深度优先搜索「DFS」遍历的C程序

什么是邻接矩阵和深度优先搜索?

在学习如何实现深度优先搜索之前,我们需要先了解什么是邻接矩阵。邻接矩阵是一个二维数组,用于表示图中的节点之间的关系。如果图是无向图,那么邻接矩阵是对称的,否则是非对称的。

深度优先搜索是一种用于遍历图的算法,它从图中的一个节点开始,尽可能深地访问节点,直到没有未访问的相邻节点。然后回溯到上一个未访问的节点,重复这个过程,直到遍历完整个图。

实现深度优先搜索

初始化邻接矩阵

在实现深度优先搜索之前,需要先创建一个邻接矩阵来表示图中的节点之间的关系。下面是一个示例图的邻接矩阵:

int matrix[5][5] = {

{0, 1, 1, 0, 0},

{1, 0, 0, 1, 1},

{1, 0, 0, 1, 0},

{0, 1, 1, 0, 1},

{0, 1, 0, 1, 0}

};

接下来,我们需要创建一个数组来表示图中的节点是否被访问过。在C语言中,我们可以使用一个整型数组来表示节点是否被访问过。数组的长度应该与邻接矩阵中节点的数量相同。

int visited[5] = {0}; // 初始化为0,表示节点还未被访问

实现深度优先搜索

我们可以使用递归的方式来实现深度优先搜索。首先,我们需要写一个函数来遍历所有的节点:

void dfs(int node) {

visited[node] = 1; // 标记当前节点为已访问

// 对于当前节点的所有相邻节点

for (int i = 0; i < 5; i++) {

if (matrix[node][i] == 1 && visited[i] == 0) { // 如果相邻节点未被访问

dfs(i); // 递归访问相邻节点

}

}

}

上面的代码中,我们首先将当前节点标记为已访问。然后,对于当前节点的所有相邻节点,如果这些相邻节点未被访问过,我们就递归访问这些相邻节点。

完整的代码实现

下面是完整的代码实现:

#include <stdio.h>

int matrix[5][5] = {

{0, 1, 1, 0, 0},

{1, 0, 0, 1, 1},

{1, 0, 0, 1, 0},

{0, 1, 1, 0, 1},

{0, 1, 0, 1, 0}

};

int visited[5] = {0};

void dfs(int node) {

visited[node] = 1;

printf("%d ", node);

for (int i = 0; i < 5; i++) {

if (matrix[node][i] == 1 && visited[i] == 0) {

dfs(i);

}

}

}

int main() {

dfs(0);

return 0;

}

我们可以从任意一个节点开始遍历所有的节点。上面的代码从节点0开始遍历所有的节点。

总结

深度优先搜索是一种非常重要的图遍历算法。在实际应用中,我们经常使用邻接矩阵来表示图中的节点之间的关系。使用递归的方式实现深度优先搜索非常简单,而且容易理解。如果您需要实现图遍历算法,深度优先搜索是一个很好的选择。

后端开发标签