c++ 广度优先搜索(Breadth-First Search,BFS)

        广度优先搜索(Breadth-First Search,BFS)是一种图遍历算法,通常用于搜索或遍历树和图等数据结构。其基本思想是先访问起始顶点,然后逐层遍历其相邻的顶点,直到找到目标顶点或遍历完所有顶点。

BFS通常使用队列作为辅助数据结构,通过先进先出的方式进行遍历。具体步骤如下:

  1. 将起始顶点放入队列中。
  2. 从队列中弹出一个顶点,并访问该顶点。
  3. 将该顶点的所有未访问过的相邻顶点放入队列。
  4. 重复步骤2和3,直到队列为空或找到目标顶点为止。

        BFS算法保证在遍历过程中按层次访问顶点,可以用于查找最短路径、解决迷宫问题等。由于使用队列作为辅助数据结构,BFS的空间复杂度较高,但时间复杂度相对较低。

广度优先搜索示例
让我们通过一个例子来看看广度优先搜索算法是如何工作的。我们使用具有 5 个顶点的无向图。

具有 5 个顶点的无向图

我们从顶点 0 开始,BFS 算法首先将其放入 Visited 列表中,并将其所有相邻顶点放入堆栈中。 

访问起始顶点并将其相邻顶点添加到队列中

接下来,我们访问队列前面的元素(即 1)并访问其相邻节点。由于 0 已经被访问过,所以我们访问 2。

 访问起始节点0的第一个邻居,即1

顶点 2 在 4 中有一个未访问的相邻顶点,因此我们将其添加到队列的后面并访问位于队列前面的 3。

 访问之前添加到队列中的 2 以添加其邻居

4 仍在队列中

队列中只剩下 4 个节点,因为 3 的唯一相邻节点(即 0)已经被访问过。我们参观它。

 访问队列中最后剩余的项目以检查它是否有未访问的邻居

由于队列为空,我们就完成了图的广度优先遍历。 

示例代码:

// BFS algorithm in C++

#include <iostream>
#include <list>

using namespace std;

class Graph {
  int numVertices;
  list<int>* adjLists;
  bool* visited;

   public:
  Graph(int vertices);
  void addEdge(int src, int dest);
  void BFS(int startVertex);
};

// Create a graph with given vertices,
// and maintain an adjacency list
Graph::Graph(int vertices) {
  numVertices = vertices;
  adjLists = new list<int>[vertices];
}

// Add edges to the graph
void Graph::addEdge(int src, int dest) {
  adjLists[src].push_back(dest);
  adjLists[dest].push_back(src);
}

// BFS algorithm
void Graph::BFS(int startVertex) {
  visited = new bool[numVertices];
  for (int i = 0; i < numVertices; i++)
    visited[i] = false;

  list<int> queue;

  visited[startVertex] = true;
  queue.push_back(startVertex);

  list<int>::iterator i;

  while (!queue.empty()) {
    int currVertex = queue.front();
    cout << "Visited " << currVertex << " ";
    queue.pop_front();

    for (i = adjLists[currVertex].begin(); i != adjLists[currVertex].end(); ++i) {
      int adjVertex = *i;
      if (!visited[adjVertex]) {
        visited[adjVertex] = true;
        queue.push_back(adjVertex);
      }
    }
  }
}

int main() {
  Graph g(4);
  g.addEdge(0, 1);
  g.addEdge(0, 2);
  g.addEdge(1, 2);
  g.addEdge(2, 0);
  g.addEdge(2, 3);
  g.addEdge(3, 3);

  g.BFS(2);

  return 0;
}

代码已被简化,以便我们可以专注于算法而不是其他细节。

BFS算法复杂度
BFS算法的时间复杂度用 的形式表示O(V + E),其中V是节点数,E 是边数。该算法的空间复杂度为O(V)。

BFS算法应用
1、通过搜索索引建立索引
2、用于 GPS 导航
3、路径寻找算法
4、在 Ford-Fulkerson 算法中找到网络中的最大流量
5、无向图中的循环检测
6、在最小生成树中

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

火山方舟:Skylark-chat(豆包同款) API调用说明

一、前言&#xff1a; 云雀 (Skylark) 是字节内部团队研发的大规模预训练语言模型系列&#xff0c;目前有 lite, plus 和 pro 三个不同规模的版本。 Skylark-chat跟豆包版本对齐&#xff08;版本更新有1天左右延迟&#xff09;。 说明&#xff1a; 1、该模型会跟进豆包&…

基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计

采集卡硬件设计 3.1 引言 采集卡的硬件设计是实现采集功能的基础&#xff0c;良好的硬件设计可以使采集功能更容 易实现&#xff0c;方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡…

在线IPV4地址转数字地址工具

在线IPV4地址转数字地址工具 - BTool在线工具软件&#xff0c;为开发者提供方便。 在线IPv4地址转数字地址工具&#xff0c;可以将IPv4形式的IP地址转换为10进制、16进制的数字地址&#xff0c;方便存储和对比。通常数字地址为10进制长整形数字&#xff0c;本工具同时提供了数…

Linux环境下的性能分析 之 CPU篇(二)

2、CPU的使用情况分析 a、类似任务管理器的top & htop 说到对CPU的性能分析&#xff0c;大家一定不会忘记windows下那个最熟悉的工具&#xff1a;任务管理器。 有了这个玩意儿&#xff0c;我们就可以看到CPU的利用率&#xff0c;以及每一个进程所占用的CPU资源。那在Linu…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Recolor)

Recolor&#xff0c;顾名思义就是重上色的意思&#xff0c;很明显能想到的用法就是老照片上色&#xff0c;也就是老照片修复&#xff0c;看下效果吧&#xff08;左边为老旧照片&#xff0c;右边为重上色效果&#xff09;&#xff1a; 当然除了这种玩法&#xff0c;也可以局部修…

职业发展利器:ChatGPT的求职建议!【文章底部添加可得内推码汇总表】

目录 引言 第一部分&#xff1a;ChatGPT的智能咨询 第二部分&#xff1a;个性化求职建议 第三部分&#xff1a;行业趋势解读 第四部分&#xff1a;实时更新的职业信息 第五部分&#xff1a;职业规划与发展路径 第六部分&#xff1a;职场心理辅导 【文章底部添加可得内推…

【Spring Cloud】高并发带来的问题及常见容错方案

文章目录 高并发带来的问题编写代码修改配置压力测试修改配置&#xff0c;并启动软件添加线程组配置线程并发数添加Http取样配置取样&#xff0c;并启动测试访问message方法观察效果 服务雪崩效应常见容错方案常见的容错思路常见的容错组件 总结 欢迎来到阿Q社区 https://bbs.c…

linux调用so库之一

任务&#xff1a;linux系统&#xff0c;已经生成so库&#xff0c;需要调用。 参考文献&#xff1a; Linux 调用动态库&#xff08;.SO文件&#xff09;总结_linux deviceio.so-CSDN博客 可以看他的第一部分&#xff0c;即显式调用。但是会报错&#xff0c;我的版本是64位的U…

主程面试如何答:你是如何管理团队与分配工作?

面试主程岗位的时,经常会被问到:”你是如何管理团队与分配工作的&#xff1f;”这种类似的问题&#xff0c;对于主程来说这个问题其实还是需要做一些自己的深度思考。每个人的性格都是不一样的&#xff0c;关注点不一样&#xff0c;回答这些问题&#xff0c;自己的答案也不一样…

JavaAPI常用类03

目录 java.lang.Math Math类 代码 运行 Random类 代码 运行 Date类/Calendar类/ SimpleDateFormat类 Date类 代码 运行 Calendar类 代码 运行 SimpleDateFormat类 代码一 运行 常用的转换符 代码二 运行 java.math BigInteger 代码 运行 BigDecimal …

Spring综合漏洞利用工具

Spring综合漏洞利用工具 工具目前支持Spring Cloud Gateway RCE(CVE-2022-22947)、Spring Cloud Function SpEL RCE (CVE-2022-22963)、Spring Framework RCE (CVE-2022-22965) 的检测以及利用&#xff0c;目前仅为第一个版本&#xff0c;后续会添加更多漏洞POC&#xff0c;以及…

该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定解决操作步骤

1. 关注“公众平台安全助手” 2. 进入“公众平台安全助手”&#xff0c;点击右上角的用户图标&#xff0c;进入公众号信息界面。 3. 进入“公众号信息”界面后&#xff0c;点击右上角的…图标&#xff0c;打开更多选项。 4. 打开“更多选项”后&#xff0c;选择设置选项&#x…

代码随想录算法训练营day26

题目&#xff1a;39_组合总数&#xff08;没看题解&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&…

Spring Boot中实现列表数据导出为Excel文件

点击下载《Spring Boot中实现列表数据导出为Excel文件》 1. 前言 本文将详细介绍在Spring Boot框架中如何将列表数据导出为Excel文件。我们将通过Apache POI库来实现这一功能&#xff0c;并解释其背后的原理、提供完整的流程和步骤&#xff0c;以及带有详细注释的代码示例。最…

Sora领航AIGC时代:深度解读行业变革与AI工具全景图

随着人工智能技术的飞速发展&#xff0c;越来越多的企业和行业开始将AI融入其核心业务流程中。在这个背景下&#xff0c;Sora以其独特的视角和全面的解决方案&#xff0c;正引领着AIGC&#xff08;人工智能生成内容&#xff09;的趋势变革。 本文将对Sora进行深度解读&#xf…

【Python时序预测系列】时序数据采样间隔不规律的解决方案(案例)

一、引言 在做时序数据相关任务时候&#xff0c;会遇到采样的间隔不规律的情况&#xff0c;比如采样周期为月&#xff0c;但是有的月份应该种种原因未能成功采样&#xff0c;如下&#xff1a; 这时候运用统计模型进行时序分析的时候往往会出现问题&#xff0c;所以我们需要构造…

原型模式(Prototype Pattern) C++

上一节&#xff1a;建造者模式&#xff08;Builder Pattern&#xff09;C 文章目录 0.理论1.原型模式的核心组成&#xff1a;2.实现方法3.什么时候使用 1.实践步骤 1: 定义怪物原型步骤 2: 实现具体怪物原型步骤 3: 使用原型创建怪物 0.理论 原型模式&#xff08;Prototype P…

力扣随笔删除有序数组中的重复项(简单26)

思路&#xff1a;根据类似于滑动窗口的思想&#xff0c;定义一个指针&#xff1b;使指针左边的区域全部为不重复元素&#xff08;包括指针所指的数字&#xff09; 以示例2为例&#xff0c;left&#xff1a;红色加粗 遍历指针i&#xff1a;黑色加粗 窗口范围&#xff0c;左边界到…

C++笔记(面对对象部分复习向)

B站&#xff1a;黑马程序员C教程 栈区&#xff0c;全局区&#xff0c;堆区和代码区 析构、构造和static 对象成员与类本身构造顺序&#xff0c;先成员后自己&#xff1b;析构则相反 static修饰成员变量,所有对象共享一份内存&#xff0c;编译阶段分配内存&#xff0c;类内声明…

[c++] char * 和 std::string

1 char * 和 std::string 的区别 char * 字符串是常量字符串&#xff0c;不能修改&#xff1b;std::string 指向的字符串可以修改 实例代码如下图所示&#xff0c;s1 和 s2 均是常量字符串&#xff0c;字符串常量保存在只读数据区&#xff0c;是只读的&#xff0c;不能写&…