广度优先搜索(BFS)算法详解

文章目录

  • 广度优先搜索(BFS)算法详解与C++实现
    • BFS的工作原理
    • BFS的实现
      • C++中BFS的实现
    • BFS的应用场景
    • 注意事项

广度优先搜索(BFS)算法详解与C++实现

广度优先搜索(Breadth-First Search,BFS)是一种遍历或搜索树和图的算法。它从树的根(或图的某一顶点)开始,探索邻近的节点,然后再对每个邻近节点做同样的操作。BFS在搜索最短路径问题、层次遍历树、图的连通性等方面有着广泛的应用。

BFS的工作原理

BFS按照距离起始节点的层数逐层向外扩展,即先访问起始节点,然后是距离起始节点最近的节点,接着是距离起始节点第二近的节点,依此类推。为了实现这种层级的遍历,BFS使用了先进先出(FIFO)的队列结构来存储每层的节点。

BFS的实现

BFS的实现通常依赖于队列数据结构,通过迭代的方式来实现。在开始时,将起始节点放入队列。然后,只要队列不为空,就从队列中移除一个节点,访问它,并将所有未访问过的邻接节点加入队列中。

C++中BFS的实现

以下是使用C++标准库中的队列来实现BFS算法的示例代码:

#include <iostream>
#include <vector>
#include <queue>// 使用队列的方式实现的BFS
void BFS(int startVertex, const std::vector<std::vector<int>>& graph) {std::vector<bool> visited(graph.size(), false);std::queue<int> queue;// 标记起始顶点为已访问,并将其入队visited[startVertex] = true;queue.push(startVertex);while (!queue.empty()) {// 取出队首元素int vertex = queue.front();queue.pop();std::cout << vertex << " ";// 遍历该顶点的所有邻接点for (int neighbor : graph[vertex]) {if (!visited[neighbor]) {visited[neighbor] = true;queue.push(neighbor);}}}
}int main() {// 图的邻接表表示std::vector<std::vector<int>> graph = {{1, 2},    // 邻接于节点0{0, 3, 4}, // 邻接于节点1{0, 4},    // 邻接于节点2{1, 5},    // 邻接于节点3{1, 2},    // 邻接于节点4{3}        // 邻接于节点5};// 从节点0开始进行BFS遍历std::cout << "BFS starting from vertex 0:\n";BFS(0, graph);return 0;
}

在上述代码中,我们先将起始节点标记为已访问并加入队列。在主循环中,我们每次从队列中取出一个节点,访问它,并把所有未访问的邻接节点加入队列中。这个过程一直持续到队列为空,即所有可达节点都被访问。

BFS的应用场景

BFS不仅可以用来遍历图,还有以下的应用:

  1. 最短路径:在无权图中找到两点间的最短路径。
  2. 连通性测试:检查图中任两个节点之间是否存在路径。
  3. 层次遍历:在树结构中按层次遍历节点。
  4. 网络爬虫:搜索引擎中的网络爬虫使用BFS来遍历网页。
  5. 广播网络:在广播网络中找出最佳的广播接收点。

注意事项

在使用BFS时,需要注意以下几点

#include <iostream>
#include <vector>
#include <queue>// 使用队列实现的BFS函数
void BFS(int startVertex, const std::vector<std::vector<int>>& graph) {std::vector<bool> visited(graph.size(), false); // 创建一个visited数组,用于跟踪已访问的节点std::queue<int> queue; // 创建一个队列,用于存储将要访问的节点// 标记起始节点为已访问,并将其加入队列visited[startVertex] = true;queue.push(startVertex);while (!queue.empty()) {// 从队列中取出一个节点,并访问它int currentVertex = queue.front();queue.pop();std::cout << "Visited " << currentVertex << std::endl;// 遍历当前节点的所有邻居for (int neighbor : graph[currentVertex]) {if (!visited[neighbor]) { // 如果邻居没有被访问过visited[neighbor] = true; // 标记邻居为已访问queue.push(neighbor); // 将邻居节点加入队列中}}}
}int main() {// 使用邻接表表示图,图中包含6个节点(编号从0到5)std::vector<std::vector<int>> graph = {{1, 2},    // 节点0与节点1和节点2相连{0, 3, 4}, // 节点1与节点0、节点3和节点4相连{0, 4},    // 节点2与节点0和节点4相连{1, 5},    // 节点3与节点1和节点5相连{1, 2},    // 节点4与节点1和节点2相连{3}        // 节点5与节点3相连};// 从节点0开始进行BFS遍历std::cout << "BFS traversal starting from vertex 0:" << std::endl;BFS(0, graph);return 0;
}

在这段代码中,我们首先定义了一个BFS函数,它接受一个起始顶点和一个图表示作为输入。图是通过邻接表的形式表示的,其中graph是一个向量的向量,graph[i]包含与节点i相邻的所有节点。我们还定义了一个visited向量来跟踪已经访问过的节点,以避免重复访问。

我们将起始节点标记为已访问并将其加入到队列中。然后,我们进入一个循环,循环将一直运行直到队列为空。在循环的每一步,我们从队列中取出一个节点,输出它被访问的信息,并遍历所有邻居。如果邻居节点尚未被访问,我们就标记它为已访问,并将其加入队列。

当队列为空时,意味着从起始节点可达的所有节点都已被访问过,BFS遍历就完成了。在main函数中,我们定义了一个简单的图并调用了BFS函数来显示从节点0开始的BFS遍历结果。

这个简单的例子展示了BFS算法的基本原理和实现,但在实际应用中,可能需要根据特定问题对算法进行调整和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/785097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《QDebug 2024年3月》

一、Qt Widgets 问题交流 1. 二、Qt Quick 问题交流 1.Qt5 ApplicationWindow 不能使用父组件 Window 的 transientParent 属性 ApplicationWindow 使用 transientParent 报错&#xff1a; "ApplicationWindow.transientParent" is not available due to compone…

集合框架——Map

双列集合 特点&#xff1a; 双列集合一次需要存一对数据&#xff0c;分别为键和值键不能重复&#xff0c;值可以重复键和值是一一对应的&#xff0c;每个键只能找到自己对应的值键值这个整体 称为&#xff1a;键值对 键值对对象 Entry对象 Map集合的常用方法 public class …

ssm框架配置文件例子

emmm。。。。 就是说&#xff0c;正常ssm的配置文件长啥样&#xff1f; 就最基础的&#xff1f; 贴一下&#xff0c;备忘吧。 第一个&#xff1a;applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http…

软考 - 系统架构设计师 - 敏捷开发方法

前言 敏捷开发方法是一种以人为核心、迭代、循序渐进的软件开发方法。它强调团队合作、客户需求和适应变化&#xff0c;旨在通过快速迭代和反馈来快速交付高质量的软件产品。 敏捷开发方法的优势在于能够快速响应变化、提高开发效率和质量、增强团队协作和沟通&#xff0c;并降…

Python程序设计 多重循环

教学案例六 多重循环 1.n之内的素数 输入n&#xff0c;显示n之内的所有素数 每行显示10个素数 例如&#xff0c;若输入500&#xff0c;结果如图所示 neval(input()) #代码开始 c 0for i in range(2, n1):for j in range(2, i):if i % j 0:breakelse:c 1print("{:5d}…

四年旅程,一路成长——小雨的创作纪念日

四年旅程&#xff0c;一路成长——小雨的创作纪念日 收到来信&#xff0c;回顾与再开始回首起点&#xff0c;初探技术世界持续前行&#xff0c;从坚持到自信今日之感&#xff0c;持续分享与感恩【3.19故事对话】我一定可以&#xff01;“新”认知状态变化感受复盘 朝着未来&…

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…

C# OpenCvSharp-HoughCircles(霍夫圆检测) 简单计数

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using O…

http模块 服务器端如何响应(获取)静态资源?

一、静态资源与动态资源介绍&#xff1a; &#xff08;1&#xff09;静态资源 内容长时间不改变的资源。eg&#xff1a;图片、视频、css js html文件、字体文件... &#xff08;2&#xff09;动态资源 内容经常更新的资源。eg&#xff1a;百度首页、淘宝搜索列表... 二、服…

vue3从精通到入门7:ref系列

Vue 3 的 Ref 是一个集合&#xff0c;包括多个与响应式引用相关的功能&#xff0c;这些功能共同构成了 Vue 3 响应式系统的重要组成部分。以下是更全面的介绍&#xff1a; 1.ref ref 接受一个内部值并返回一个响应式且可变的 ref 对象。这个对象具有一个 .value 属性&#xf…

每天学习一个Linux命令之uniq

每天学习一个Linux命令之uniq 介绍 在Linux操作系统中&#xff0c;有许多强大的命令可以帮助我们提高工作效率。本篇博客将详细介绍一个非常有用的命令&#xff1a;uniq。uniq命令用于从已排序的文件或标准输入中删除重复的行&#xff0c;并将结果输出到标准输出中。 命令格…

【小熊猫 ide】更新支持mingw 支持c++20

没有format 头文件 GCC版本对C++的支持情况即使我使用11,也没有format 头文件小熊猫 ide https://wwe.lanzoui.com/b01os0mwd最新11可以自己更新https://royqh1979.gitee.io/redpandacpp/docsy/docs/gcc13 才支持format [7GCC 13 has added support for std::format.](https:/…

算法刷题笔记(3.25-3.29)

算法刷题笔记 3.25-3.29 1. 相同的树2. 二叉树的最近公共祖先3. 二叉搜索树中第K小的元素通过双端队列duque 中序遍历 4. 二叉树的锯齿形层序遍历new LinkedList<Integer>(levelList)双端队列复制 数组需要左右顺序&#xff0c;考虑双端队列 5. 岛屿数量6. 字典序排数&am…

Device Change-Procedure

Start Conditions: • The Service Provider has provided to the SM-DP the relevant information and configuration for the Device Change (see Annex O). • The End User has an old Device containing a Profile. • The eUICC and the LPAd of the old Device support …

python---基础(一)

文章目录 前言1.对象的基本组成2.变量和常量2.1.变量的声明2.2.常量_链式赋值_系列解包赋值2.2.1.常量是不是真的常量&#xff1f;2.2.2.链式赋值2.2.3.系列解包赋值 3.内置数据类型_基本算数运算符3.1四种内置数据类型3.2.基本运算符3.3.divmod() 前言 这几年&#xff0c;随着…

【Python】——变量名的命名规则

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【C脚本】计算PCM的DBFS(分贝全尺度)

DBFS是分贝全尺度&#xff08;Decibels Full Scale&#xff09;的缩写&#xff0c;是一种用于衡量音频信号强度的单位。DBFS是相对于数字音频的最大可能幅度而言的&#xff0c;它的取值范围通常是从0到-∞。在DBFS中&#xff0c;0表示音频信号的最大幅度&#xff0c;-∞表示完全…

Dijkstra堆优化之蓝桥王国

Dijkstra堆优化 Dijkstra算法是一种用于解决单源最短路径问题的算法&#xff0c;即从图中的一个顶点出发到所有其他顶点的最短路径。然而&#xff0c;处理大图时&#xff0c;常规的Dijkstra算法可能会遇到性能问题。这就是Dijkstra的堆优化算法派上用场的地方。在堆优化版本中…

Python 用pygame简简单单实现一个打砖块

# -*- coding: utf-8 -*- # # # Copyright (C) 2024 , Inc. All Rights Reserved # # # Time : 2024/3/30 14:34 # Author : 赫凯 # Email : hekaiiii163.com # File : ballgame.py # Software: PyCharm import math import randomimport pygame import sys#…

(23)3.31 进阶指针

int main() { //指针数组 int* arr[4]; char* ch[5]; //数组指针 int arr2[5]; int(*pa)[5] &arr2; char* arr3[6]; char* (*p3)[6] &arr3; return 0; } int test(const char* str) { return 0; } int main() { …