数据结构与C

数据结构与C 知识量:8 - 24 - 99

6.3 图的遍历><

深度优先搜索- 6.3.1 -

深度优先搜索(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开始执行深度优先搜索,并打印出遍历的顶点序列。

广度优先搜索- 6.3.2 -

广度优先搜索(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开始执行广度优先搜索,并打印出遍历的顶点序列。