C++ 广度优先搜索(bfs)(五十四)【第一篇】

2024-02-13 08:12

本文主要是介绍C++ 广度优先搜索(bfs)(五十四)【第一篇】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天我们来学习一下一个新的搜索,广度优先搜索。

1.广度优先搜索的前提

队列(queue) 是一种 操作受限制 的线性表,其限制:

  • 只允许从表的前端(front)进行删除操作;

  • 只允许在表的后端(rear)进行插入操作。

一般允许进行插入的一端我们称为 队尾 ,允许删除的一端称为 队首 ;

图片

队列的主要操作包括:

  • 入队(push):队列的插入操作

  • 出队(pop):队列的删除操作

  • 判断队列是否为空(empty)

  • 统计队列元素的个数(size)

  • 访问队首元素(front)

数据存取特点:具有 先进先出 的性质。

2.广度优先搜索

广度优先搜索,又称宽度优先搜索,简称 BFS,我们以后都会用 BFS 来表示广度优先搜索。与深度优先搜索不同的是,广度优先搜索会先将与起始点距离较近的点搜索完毕,再继续搜索较远的点,而深搜却是沿着一个分支搜到最后。

BFS 从起点开始,优先搜索离起点最近的点,然后由这个最近的点扩展其他稍近的点,这样一层一层的扩展,就像水波扩散一样。

图片

对上图进行深搜按照顶点访问顺序会得到序列:A−B−E−F−C−D−G

对上图进行广搜按照顶点访问顺序会得到序列:A−B−C−D−E−F−G

广度优先搜索的层次关系是很明显的,上面的图的分层次关系如下:

  • 第一层的点为 A

  • 第二层的点为 B,C,D

  • 第三层的点为 E,F,G

BFS 需要借助队列来实现:

  1. 初始的时候把起始点放到队列中,并标记起点访问。

  2. 如果队列不为空,从队列中取出一个元素 
    x,否则算法结束。

  3. 访问和 
    x 相连的所有点 
    v,如果 
    v 没有被访问,把 v 入队,并标记已经访问。

  4. 重复执行步骤 2。

最后写出来的代码框架如下:

void bfs(起始点) {/*将起始点放入队列中;*//*标记起点访问;*/while (/*如果队列不为空*/) {/* 访问队列中队首元素x *//* 删除队首元素 */for (/* x 所有相邻点 */) {if (/* 该点未被访问过且合法 */) {/*标记该点访问*//*将该点加入队列末尾*/}}}/*队列为空,广搜结束*/
}

注意这里标记一个点是否访问必须在放入队列的时候标记,避免一个点在队列中但没被访问的情况下再次被放入队列的可能。

这篇关于C++ 广度优先搜索(bfs)(五十四)【第一篇】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704985

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

C# ComboBox下拉框实现搜索方式

《C#ComboBox下拉框实现搜索方式》文章介绍了如何在加载窗口时实现一个功能,并在ComboBox下拉框中添加键盘事件以实现搜索功能,由于数据不方便公开,作者表示理解并希望得到大家的指教... 目录C# ComboBox下拉框实现搜索步骤一步骤二步骤三总结C# ComboBox下拉框实现搜索步骤一这

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<