数据结构与C 知识量:8 - 24 - 99
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
深度优先搜索属于图算法的一种,其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。
以下是一个使用C语言实现深度优先搜索的示例代码:
#include <stdio.h> #include <stdlib.h> #define MAX_VERTICES 100 int visited[MAX_VERTICES]; int adj_matrix[MAX_VERTICES][MAX_VERTICES]; void dfs(int v) { visited[v] = 1; printf("%d ", v); int i; for (i = 0; i < MAX_VERTICES; i++) { if (adj_matrix[v][i] == 1 && visited[i] == 0) { dfs(i); } } } int main() { int n, m; printf("Enter the number of vertices and edges: "); scanf("%d %d", &n, &m); int i, j; for (i = 0; i < n; i++) { visited[i] = 0; } printf("Enter the adjacency matrix:\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &adj_matrix[i][j]); } } printf("DFS traversal:\n"); dfs(0); return 0; }
在这个示例代码中,首先定义了一个visited数组来跟踪每个顶点是否被访问过。然后,定义了一个adj_matrix二维数组来表示图的邻接矩阵。接下来,实现了dfs函数来执行深度优先搜索。最后,在main函数中读取用户输入的顶点和边的数量,并读取邻接矩阵。然后,从顶点0开始执行深度优先搜索,并打印出遍历的顶点序列。
广度优先搜索(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的算法。这种算法从根节点(或任意节点)开始,探索最近的节点,然后转向它们的未访问的邻居。
广度优先搜索通常使用队列数据结构来实现。在搜索过程中,首先将根节点放入队列中。然后,当队列不为空时,从队列中取出一个节点,并检查它的所有邻居。如果邻居节点未被访问过,则将其标记为已访问,并将其放入队列的末尾。这个过程一直持续到队列为空,即所有可达的节点都被访问过为止。
广度优先搜索在许多场景中都有应用,例如在搜索引擎中用于网页的爬取和排序,在图遍历中用于寻找最短路径等。
以下是一个使用C语言实现广度优先搜索的示例代码:
#include <stdio.h> #include <stdlib.h> #define MAX_VERTICES 100 int visited[MAX_VERTICES]; int adj_matrix[MAX_VERTICES][MAX_VERTICES]; void bfs(int start_vertex) { int queue[MAX_VERTICES]; int front = 0, rear = 0; visited[start_vertex] = 1; printf("%d ", start_vertex); queue[rear++] = start_vertex; while (front < rear) { int current_vertex = queue[front++]; int i; for (i = 0; i < MAX_VERTICES; i++) { if (adj_matrix[current_vertex][i] == 1 && visited[i] == 0) { visited[i] = 1; printf("%d ", i); queue[rear++] = i; } } } } int main() { int n, m; printf("Enter the number of vertices and edges: "); scanf("%d %d", &n, &m); int i, j; for (i = 0; i < n; i++) { visited[i] = 0; } printf("Enter the adjacency matrix:\n"); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &adj_matrix[i][j]); } } printf("BFS traversal:\n"); bfs(0); return 0; }
在这个示例代码中,首先定义了一个visited数组来跟踪每个顶点是否被访问过。然后,定义了一个adj_matrix二维数组来表示图的邻接矩阵。接下来,实现了bfs函数来执行广度优先搜索。最后,在main函数中读取用户输入的顶点和边的数量,并读取邻接矩阵。然后,从顶点0开始执行广度优先搜索,并打印出遍历的顶点序列。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6