使用给定图中的邻接矩阵实现 DFS 遍历的 C 程序

data structurec++programming

简介

图论使我们能够研究和可视化对象或实体之间的关系。在当前的计算机科学技术中,图遍历在探索和分析不同类型的数据结构中起着至关重要的作用。在图上执行的关键操作之一是遍历 - 访问所有顶点或节点,遵循特定路径。基于深度优先方法的 DFS 遍历使我们能够在回溯和探索其他分支之前探索图的深度。在本文中,我们将涉及使用 C 中的邻接矩阵表示实现 DFS 遍历。

使用邻接矩阵的 DFS 遍历

图由两个主要组件组成,即表示实体或元素的顶点或节点,以及连接这些顶点的边,描述它们之间的关系。

表示加权或非加权图中顶点之间关系的唯一方法是使用邻接矩阵。它通常采用方阵的形式,其中行表示源顶点,列表示目标顶点,每个单元格包含有关相应对之间的边存在或权重的信息。

示例

输入由使用图的四个顶点的一组特定元素给出。输入为:

1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1

设图的起始顶点为 2。图将从顶点"2"开始遍历。顶点"2"的相邻顶点显然是 1 和 3。由于起始顶点是 2,因此在遍历过程中不能再次访问它。在顶点 2 之后访问了顶点 3,那么我们需要查看顶点 3 的邻接顶点,即 1 和 2。顶点 1 和顶点 2 已被访问,遍历停止。

方法 1:包含使用邻接矩阵作为给定图中输入的 DFS 遍历的 C 程序

输入用某些数字定义,使用 for 循环,它将遍历邻接矩阵并返回 DFS 遍历。

算法

步骤 1:程序首先定义一个常量 `MAX` 来表示给定图中的最大节点数,并初始化一个名为 `visited` 的数组,以跟踪在遍历过程中是否访问过特定节点。

步骤 2:'dfs()' 函数采用参数为一个方形邻接矩阵作为"adjMatrix",表示我们的图,顶点总数为"vCount",起始顶点为"start"。此函数对给定的图执行递归深度优先搜索遍历。

步骤 3:在 'dfs()' 函数中,我们使用基于布尔值的 'visited[]' 数组中的索引将每个当前处理的顶点标记为"已访问",并相应地打印其值。

步骤 4:'dfs()' 中的循环递归遍历当前节点的所有未访问邻居,直到没有可能获得与其连接的顶点。

步骤 5:在 main() 中,我们使用嵌套循环从用户那里读取输入,例如顶点数量为 'vCount' 及其相应的连接到邻接矩阵中。

步骤 6:然后,我们在初始化 'visited[]' 的每个元素之前提示用户输入他们想要的起始顶点数组为零(因为尚未访问任何节点)。

步骤 7:最后,程序使用适当的参数调用"dfs()"函数来启动深度优先搜索遍历,并打印出 DFS 遍历路径。

示例

//包含所需的头文件
#include<stdio.h>
#define MAX 100

int accessed[MAX];
//dfs 函数使用三个参数定义
void dfs(int adjMatrix[][MAX], int vCount, int start) {
   visited[start] = 1;
   printf("%d ", start);

   for(int i=0; i<vCount; i++) {
      if(adjMatrix[start][i] && !visited[i]) {
         dfs(adjMatrix,vCount,i);
      }
   }
}
//main函数用于实现上述功能
int main() {
    int adjMatrix[MAX][MAX];
    int vCount;
    
    // 为变量赋值为4
    vCount = 4;
    
    // 直接为邻接矩阵赋值,与上面的例子相同
    adjMatrix[0][0] = 1;
    adjMatrix[0][1] = 0;
    adjMatrix[0][2] = 0;
    adjMatrix[0][3] = 1;
    adjMatrix[1][0] = 0;
    adjMatrix[1][1] = 1;
    adjMatrix[1][2] = 1;
    adjMatrix[1][3] = 0;
    adjMatrix[2][0] = 0;
    adjMatrix[2][1] = 1;
    adjMatrix[2][2] = 1;
    adjMatrix[2][3] = 0;
    adjMatrix[3][0] = 1;
    adjMatrix[3][1] = 0;
    adjMatrix[3][2] = 0;
    adjMatrix[3][3] = 1;
    //将起始变量声明为整数数据类型,稍后赋值为 2
    int start;
    
    // 直接赋值起始顶点
    start = 2;
    
    for(int i = 0; i < MAX; ++i) {
        visited[i] = 0;
    }
    
    printf("\nDFS Traversal: ");
    dfs(adjMatrix, vCount, start);
    
    return 0;
}

输出

DFS Traversal: 2 1

结论

通过使用邻接矩阵作为图的表示,我们可以有效地对大型或复杂的数据集执行 DFS。在本文中,我们详细解释了这一点,并给出了一个使用基于邻接矩阵的表示实现深度优先搜索遍历的 C 程序。深度优先搜索是一种用于探索和分析图结构的强大算法。


相关文章