给定一个图,使用邻接矩阵实现深度优先搜索「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开始遍历所有的节点。

总结

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

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签