📜  用于图的广度优先搜索或 BFS 的 C 程序(1)

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

用于图的广度优先搜索或 BFS 的 C 程序

简介

广度优先搜索(BFS)是一种图的遍历算法。该算法生成一棵树,该树以图的根节点开始,并向外扩展子树,以便每个相邻节点都被访问一次。BFS 算法通过队列实现,它提供了一种算法来确定图中两个节点之间的最短路径和最短距离。本篇文章将介绍如何在 C 语言中实现 BFS 算法。

BFS 算法的步骤

BFS 算法的步骤如下:

  1. 创建一个队列,并将起始节点放入队列中。
  2. 将当前节点标记为已访问。
  3. 从队列中取出节点,并将其邻居放入队列中(如果邻居未被访问)。
  4. 标记这些邻居为已访问。
  5. 如果队列非空,则跳转到步骤 3。
C 代码实现 BFS

下面是一个用于图的 BFS 程序的示例代码。代码中,我们使用邻接矩阵和队列数据结构来实现 BFS 算法。

#include <stdio.h>

#define MAX_NODES 100

int adj_mat[MAX_NODES][MAX_NODES];
int visited[MAX_NODES];
int queue[MAX_NODES];

void bfs(int start_node, int n_nodes) {
    int front, rear; // 队列的头和尾
    front = 0; // 初始化队列为0
    rear = 0;
    queue[rear] = start_node; // 加入起始节点
    visited[start_node] = 1; // 标记节点已访问
    
    while (front <= rear) { // 队列非空
        int current_node = queue[front]; // 取出队列头部节点
        front++;
        
        printf("%d\n", current_node); // 处理当前节点
        
        for (int i = 0; i < n_nodes; i++) { // 查找邻居节点
            if (adj_mat[current_node][i] == 1 && visited[i] == 0) { // 邻居未被访问
                rear++;
                queue[rear] = i; // 加入队列
                visited[i] = 1; // 标记节点已访问
            }
        }
    }
}

int main() {
    int n_nodes, start_node;
    printf("请输入节点数和起始节点:");
    scanf("%d %d", &n_nodes, &start_node);
    
    printf("请输入邻接矩阵:");
    for (int i = 0; i < n_nodes; i++) {
        for (int j = 0; j < n_nodes; j++) {
            scanf("%d", &adj_mat[i][j]);
        }
    }
    
    printf("BFS 遍历结果:\n");
    bfs(start_node, n_nodes);
    
    return 0;
}
代码解释

在主函数中,我们首先输入节点数和起始节点。然后,我们输入图的邻接矩阵。BFS 程序的主流程在函数 bfs 中。该函数使用队列数据结构来访问每个节点。该函数使用一个数组 visited 来存储已访问的节点。默认情况下,visited 数组中所有元素均为 0,因为它们表示尚未访问。函数 bfs 接受两个参数,即起始节点和节点数。该函数使用一个 while 循环来遍历与当前节点相邻的所有节点。我们使用变量 frontrear 来标记队列的头和尾。BFS 程序的关键在于处理未被访问的节点,并将它们加入队列,以便以后处理。

总结

BFS 算法是一个有用的算法,它可以找到两个节点之间的最短距离和路径。我们可以使用邻接列表和邻接矩阵来表示一个图,然后使用 BFS 算法来遍历该图。在实现 BFS 算法时,我们必须遵循特定的步骤,以确保该算法能够正确地执行。这些步骤包括创建队列,将起始节点加入队列,处理当前节点,遍历与当前节点相邻的所有节点,并将它们加入队列。我们应该仔细阅读本文中的示例代码,并尝试理解其中的各个步骤,以便在需要使用 BFS 算法时可以轻松地编写 C 代码。