📅  最后修改于: 2023-12-03 15:11:16.221000             🧑  作者: Mango
广度优先搜索(BFS)是一种图的遍历算法。该算法生成一棵树,该树以图的根节点开始,并向外扩展子树,以便每个相邻节点都被访问一次。BFS 算法通过队列实现,它提供了一种算法来确定图中两个节点之间的最短路径和最短距离。本篇文章将介绍如何在 C 语言中实现 BFS 算法。
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 循环来遍历与当前节点相邻的所有节点。我们使用变量 front
和 rear
来标记队列的头和尾。BFS 程序的关键在于处理未被访问的节点,并将它们加入队列,以便以后处理。
BFS 算法是一个有用的算法,它可以找到两个节点之间的最短距离和路径。我们可以使用邻接列表和邻接矩阵来表示一个图,然后使用 BFS 算法来遍历该图。在实现 BFS 算法时,我们必须遵循特定的步骤,以确保该算法能够正确地执行。这些步骤包括创建队列,将起始节点加入队列,处理当前节点,遍历与当前节点相邻的所有节点,并将它们加入队列。我们应该仔细阅读本文中的示例代码,并尝试理解其中的各个步骤,以便在需要使用 BFS 算法时可以轻松地编写 C 代码。