广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。

简介: 广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。

与深度优先搜索不同,BFS 从起始顶点开始,沿着图的宽度遍历图的节点,直到找到目标节点或遍历完整个图。BFS 通常使用队列来实现,它遵循以下步骤:

 

1. 将起始顶点放入队列中,并标记为已访问。

2. 从队列中取出一个顶点作为当前顶点。

3. 对于当前顶点的每个未访问的邻居顶点,将其标记为已访问并放入队列中。

4. 重复步骤 2 和步骤 3,直到队列为空。

 

BFS 的特点包括:

 

- 广度优先:按照层级顺序逐层遍历图的节点,先访问离起始顶点最近的节点。

- 最短路径:如果图中的边具有相同的权重,则从起始顶点到任意顶点的路径都是最短路径。

- 非递归性质:BFS 使用队列来存储待访问的节点,因此是一个非递归的算法。

 

BFS 在许多领域都有广泛的应用,包括图论、网络路由算法、最短路径算法等。

 

以下是 C、C++、Java、Python 四种语言下实现广度优先搜索的示例代码:

 

### C 语言

 

```c
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_VERTICES 100
 
typedef struct {
    int data[MAX_VERTICES];
    int front, rear;
} Queue;
 
void init(Queue *q) {
    q->front = 0;
    q->rear = -1;
}
 
void enqueue(Queue *q, int value) {
    q->data[++(q->rear)] = value;
}
 
int dequeue(Queue *q) {
    return q->data[(q->front)++];
}
 
int isEmpty(Queue *q) {
    return q->front > q->rear;
}
 
typedef struct {
    int vertices[MAX_VERTICES][MAX_VERTICES];
    int visited[MAX_VERTICES];
    int num_vertices;
} Graph;
 
void initGraph(Graph *g, int num_vertices) {
    g->num_vertices = num_vertices;
    for (int i = 0; i < num_vertices; i++) {
        g->visited[i] = 0;
        for (int j = 0; j < num_vertices; j++) {
            g->vertices[i][j] = 0;
        }
    }
}
 
void addEdge(Graph *g, int v1, int v2) {
    g->vertices[v1][v2] = 1;
    g->vertices[v2][v1] = 1;
}
 
void bfs(Graph *g, int start) {
    Queue q;
    init(&q);
    enqueue(&q, start);
    g->visited[start] = 1;
 
    while (!isEmpty(&q)) {
        int current = dequeue(&q);
        printf("%d ", current);
 
        for (int i = 0; i < g->num_vertices; i++) {
            if (g->vertices[current][i] == 1 && g->visited[i] == 0) {
                enqueue(&q, i);
                g->visited[i] = 1;
            }
        }
    }
}
 
int main() {
    Graph g;
    initGraph(&g, 6);
    addEdge(&g, 0, 1);
    addEdge(&g, 0, 2);
    addEdge(&g, 1, 3);
    addEdge(&g, 1, 4);
    addEdge(&g, 2, 5);
 
    printf("BFS traversal starting from vertex 0: ");
    bfs(&g, 0);
 
    return 0;
}
```

 

### C++ 语言

```cpp
#include <iostream>
#include <vector>
#include <queue>
 
using namespace std;
 
void bfs(vector<vector<int>>& graph, vector<bool>& visited, int start) {
    queue<int> q;
    q.push(start);
    visited[start] = true;
 
    while (!q.empty()) {
        int current = q.front();
        q.pop();
        cout << current << " ";
 
        for (int i = 0; i < graph[current].size(); i++) {
            int neighbor = graph[current][i];
            if (!visited[neighbor]) {
                q.push(neighbor);
                visited[neighbor] = true;
            }
        }
    }
}
 
int main() {
    vector<vector<int>> graph = {{1, 2}, {0, 3, 4}, {0, 5}, {1}, {1}, {2}};
    vector<bool> visited(graph.size(), false);
 
    cout << "BFS traversal starting from vertex 0: ";
    bfs(graph, visited, 0);
 
    return 0;
}
```

 

### Java 语言

```java
import java.util.LinkedList;
import java.util.Queue;
 
class Graph {
    private int numVertices;
    private int[][] vertices;
    private boolean[] visited;
 
    public Graph(int numVertices) {
        this.numVertices = numVertices;
        vertices = new int[numVertices][numVertices];
        visited = new boolean[numVertices];
    }
 
    public void addEdge(int v1, int v2) {
        vertices[v1][v2] = 1;
        vertices[v2][v1] = 1;
    }
 
    public void bfs(int start) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(start);
        visited[start] = true;
 
        while (!queue.isEmpty()) {
            int current = queue.poll();
            System.out.print(current + " ");
 
            for (int i = 0; i < numVertices; i++) {
                if (vertices[current][i] == 1 && !visited[i]) {
                    queue.add(i);
                    visited[i] = true;
                }
            }
        }
    }
 
    public static void main(String[] args) {
        Graph graph = new Graph(6);
        graph.addEdge(0, 1

 

```java
import java.util.LinkedList;
import java.util.Queue;
 
class Graph {
    private int numVertices;
    private int[][] vertices;
    private boolean[] visited;
 
    public Graph(int numVertices) {
        this.numVertices = numVertices;
        vertices = new int[numVertices][numVertices];
        visited = new boolean[numVertices];
    }
 
    public void addEdge(int v1, int v2) {
        vertices[v1][v2] = 1;
        vertices[v2][v1] = 1;
    }
 
    public void bfs(int start) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(start);
        visited[start] = true;
 
        while (!queue.isEmpty()) {
            int current = queue.poll();
            System.out.print(current + " ");
 
            for (int i = 0; i < numVertices; i++) {
                if (vertices[current][i] == 1 && !visited[i]) {
                    queue.add(i);
                    visited[i] = true;
                }
            }
        }
    }
 
    public static void main(String[] args) {
        Graph graph = new Graph(6);
        graph.addEdge(0, 1);
        graph.addEdge(0, 2);
        graph.addEdge(1, 3);
        graph.addEdge(1, 4);
        graph.addEdge(2, 5);
 
        System.out.print("从顶点 0 开始的广度优先遍历:");
        graph.bfs(0);
    }
}
```

 

这段代码创建了一个包含 6 个顶点的图,并在它们之间添加了边。然后,它从顶点 0 开始执行广度优先遍历,并打印遍历顺序。

目录
打赏
0
1
1
0
8
分享
相关文章
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
103 62
算法系列之搜索算法-深度优先搜索DFS
|
1月前
|
算法系列之搜索算法-广度优先搜索BFS
广度优先搜索(BFS)是一种非常强大的算法,特别适用于解决最短路径、层次遍历和连通性问题。在面试中,掌握BFS的基本实现和应用场景,能够帮助你高效解决许多与图或树相关的问题。
40 1
算法系列之搜索算法-广度优先搜索BFS
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
67 2
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
124 5
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等