📜  深度优先搜索的 C 程序或图的 DFS(1)

📅  最后修改于: 2023-12-03 15:40:45.845000             🧑  作者: Mango

深度优先搜索的 C 程序或图的 DFS

什么是深度优先搜索?

深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法。它从一条未被访问的路径开始追溯,直到到达最深的节点,然后返回到最近的未被访问的节点,重复此过程并返回,直到没有未被访问的路径。

如何实现深度优先搜索?

深度优先搜索可以使用递归或迭代的方式来实现。下面是一个使用递归的深度优先搜索的示例:

void DFS(int v, int visited[], int graph[][MAX]){
    int i;
    visited[v] = 1; // 标记当前节点为已访问
    printf("%d ", v); // 输出当前访问到的节点

    // 递归遍历与当前节点相邻的节点
    for (i = 0; i < MAX; i++){
        if (graph[v][i] && !visited[i]){ // 如果两节点间有边且相邻节点未被访问
            DFS(i, visited, graph); // 递归访问该节点
        }
    }
}

其中,v是当前访问的节点,visited[]是记录每个节点访问状态的数组,graph[][MAX]是图的邻接矩阵表示。

代码中,我们首先将当前节点标记为已访问,并输出节点号。然后遍历与当前节点相邻的所有节点,如果相邻节点未被访问过,就递归访问该节点。

实例演示

为了更好地理解深度优先搜索的实现方式,我们以以下的图为例:

0--------1
|        |
|        |
|        |
2--------3

这是一个简单的4个节点的图,我们使用邻接矩阵表示如下:

// 0 1 2 3
int graph[MAX][MAX] = {
    {0, 1, 1, 0},
    {1, 0, 0, 1},
    {1, 0, 0, 1},
    {0, 1, 1, 0},
};

然后我们可以构造一个 main() 函数来演示深度优先搜索的实现:

int main() {
    int i, visited[MAX] = {0}; // 初始化 visited 数组为0
    printf("\nDFS遍历结果:");
    DFS(0, visited, graph);
    return 0;
}

main() 函数中,我们创建一个 visited 数组来记录每个节点的访问状态,初始化为0。然后调用 DFS() 函数来进行深度优先搜索,从节点0开始访问。

总结

深度优先搜索是一种常用的遍历或搜索树或图的算法,可以用递归或迭代的方式实现。本文提供了使用递归实现深度优先搜索的 C 程序示例,并以一个简单的图为例演示。