【程序设计竞赛算法】深度优先搜索
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。它从根节点(或起始节点)开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,再选择其他路径继续探索,直到所有节点都被访问为止。
深度优先搜索的具体过程如下:
1、选择起始节点,并标记为已访问。
2、访问当前节点,并进行相应的操作。
3、从当前节点选择一个未被访问的邻居节点。
4、如果存在未被访问的邻居节点,则将其标记为已访问,并将其作为当前节点,回到步骤2。
5、如果当前节点没有未被访问的邻居节点,或者已达到目标节点,则回溯到上一个节点。
6、重复步骤3到步骤5,直到所有节点都被访问。
下面是一个使用C语言实现深度优先搜索的例子。假设我们有一个有向图,用邻接矩阵表示。我们将从节点0开始进行深度优先搜索。
#include <stdio.h>
#define MAX_NODES 100
int visited[MAX_NODES] = {0}; // 记录节点是否被访问过
int graph[MAX_NODES][MAX_NODES]; // 邻接矩阵表示的有向图
int numNodes; // 节点数量
void dfs(int node) {
visited[node] = 1; // 标记当前节点为已访问
printf("访问节点: %d\n", node);
// 遍历当前节点的邻居节点
for (int i = 0; i < numNodes; i++) {
if (graph[node][i] == 1 && visited[i] == 0) {
dfs(i); // 递归调用深度优先搜索
}
}
}
int main() {
// 初始化有向图
numNodes = 6;
graph[0][1] = 1;
graph[0][2] = 1;
graph[1][3] = 1;
graph[1][4] = 1;
graph[2][4] = 1;
graph[3][4] = 1;
graph[3][5] = 1;
printf("深度优先搜索结果:\n");
dfs(0); // 从节点0开始进行深度优先搜索
return 0;
}
在这个例子中,我们使用邻接矩阵表示有向图。visited数组用于记录节点是否被访问过,初始时所有节点都未被访问。dfs函数实现了深度优先搜索的逻辑,在每个节点被访问时,我们将其标记为已访问,并输出该节点。然后,我们遍历该节点的邻居节点,如果邻居节点未被访问,则递归调用dfs函数继续探索该邻居节点及其邻居节点。通过递归调用,深度优先搜索会一直沿着一条路径尽可能深入,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,继续选择其他路径进行搜索。最终,所有节点都被访问完毕。
以上给出的例子是一个简单的有向图的深度优先搜索实现,你可以根据需要进行修改和扩展。注意,该实现并没有考虑图中可能存在环的情况,如果图中存在环,可能导致无限递归,需要额外的机制来处理环。