广度优先搜索(BFS)的原理和应用

C语言 深度优先搜索和广度优先搜索 深度优先搜索是从一个节点开始,沿着一条路径一直走到底,如果走到了死路,就回退到上一个节点,再继续走其他路径,直到遍历完整个图。广度优先搜索是从一个节点开始,先访问这个节点的所有邻居节点,然后依次访问这些邻居节点的邻居节点,直到遍历完整个图。两者的主要区别在于搜索的顺序不同,深度优先搜索的搜索顺序是一条路走到黑,直到遇到死路才回退,而广度优先搜索的搜索顺序是逐层遍历,先遍历距离起始节点为1的节点,再遍历距离起始节点为2的节点,以此类推。 阅读详情

 

广度优先搜索(BFS)的原理和应用

       二叉树中的层序遍历就属于一种BFS(Board First Search)


       层序遍历会得到ABCDEFG的层序优先序列(BFS序列)。在层序遍历过程中,可以注意到先访问的节点的孩子节点必然先被访问(如访问了A后访问B和C,那么B的孩子结点一定在C的孩子结点前被访问――仅针对下一层的孩子而言)。据这个特性,可以用队列来实现这个遍历。

void Layer(bitree *p)
{
 queue<node*> Q; //定义一个队列
 node *N;
 Q.push(*p);   //起始点入队
 while(!Q.empty())
 {
   N=Q.front();
   Q.pop();
   cout<<N->data<<endl;
   if(N->lchild!=NULL)  //将扩展子结点(仅一层)全都入队
   Q.push(N->lchild);
   if(N->rchild!=NULL)
   Q.push(N->rchild);
 }
}

BFS比它更进一步,可以针对图的结构进行BFS遍历

的BFS(从V1开始)路径是


广搜的一般结构如下:

定义一个队列;

起始点入队;

while(队列不空){

    队头结点出队;

    若它是所求的目标状态,跳出循环;

    否则,将它扩展出的子结点,全都入队;

}

若循环中找到目标,输出结果;

否则输出无解;

它的主要特点是:

n      每次队头元素出队时,扩展其全部的子结点,并用队列记录下来。

n      搜索过程没有回溯,是一种牺牲空间换取时间的方法。

来看个BFS的经典例子吧Knight Moves zoj(1091)!

       题目:国际象棋棋盘上有个马,要跳到指定坐标,求最少的跳的步数!

  

输入:

a1 h8

输出:

To get from a1 to h8 takes 6 knight moves.

先来看看跳马的规则,马只能往自己在的坐标的2*3或3*2范围内跳动!

例如:要从a1到e4: 

 

第1次所有能跳到的点 

 

第2次所有能跳到的点   

      

        第3次所有能跳到的点

       当第3次时达到了e4,说明已经达到目的。

       以下是我完全可运行的源程序:

#include<iostream>
#include<memory>
#include<queue>
using namespace std;

 

int dir[8][2]=
{{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{-1,2},{-1,-2},{1,-2}
};    //八个可能方向


int flag[8][8]; //标记棋盘中一个点是否已经被踏过


struct  node
{
 int x,y,step; //棋盘点的坐标和几次可达的信息
};


int main()
{
 char a,b,c,d;
 node N,P;
 queue<node> Q;
 memset(flag,0,64);
 cin>>a>>b>>c>>d;
 int r1=a-'a';
 int c1=b-'1';
 int r2=c-'a';
 int c2=d-'1';
 N.x=r1;N.y=c1;N.step=0;
 Q.push(N);     //初始节点入队
 flag[r1][c1]=1;  
 while(!Q.empty())
 {
  N=Q.front();Q.pop();  //出队
  if(N.x==r2&&N.y==c2)  //达到目的,则跳出
   break;
  for(int i=0;i<8;i++)   //八方向搜索
  {
   int tx=N.x+dir[i][0];
   int ty=N.y+dir[i][1];
   if(tx>=0&&tx<8&&ty>=0&&ty<8&&flag[tx][ty]==0) //看是否在棋盘内和是否已经被踏过
   {
    P.x=tx;P.y=ty;P.step=N.step+1;
    Q.push(P);
    flag[tx][ty]=1;  //标记为被踏过
   }
  }
 }
 cout<<"To get from "<<a<<b<<" to "<<c<<d<<' ';
 cout<<"takes "<<N.step<<" knight moves."<<endl;
}

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。
已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的宽度优先树。对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。
之所以称之为宽度优先算法,是因为算法自始至终一直通过已找到和末找到顶点之间的边界向外扩展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点。
为了保持搜索的轨迹,宽度优先搜索为每个顶点着色:白色、灰色或黑色。算法开始前所有顶点都是白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。在搜索中第一次碰到一顶点时,我们说该顶点被发现,此时该顶点变为非白色顶点。因此,灰色和黑色顶点都已被发现,但是,宽度优先搜索算法对它们加以区分以保证搜索以宽度优先的方式执行。若(u,v)∈E且顶点u为黑色,那么顶点v要么是灰色,要么是黑色,就是说,所有和黑色顶点邻接的顶点都已被发现。灰色顶点可以与一些白色顶点相邻接,它们代表着已找到和未找到顶点之间的边界。
在宽度优先搜索过程中建立了一棵宽度优先树,起始时只包含根节点,即源顶点s.在扫描已发现顶点u的邻接表的过程中每发现一个白色顶点v,该顶点v及边(u,v)就被添加到树中。在宽度优先树中,我们称结点u是结点v的先辈或父母结点。因为一个结点至多只能被发现一次,因此它最多只能有--个父母结点。相对根结点来说祖先和后裔关系的定义和通常一样:如果u处于树中从根s到结点v的路径中,那么u称为v的祖先,v是u的后裔。
下面的宽度优先搜索过程BFS假定输入图G=(V,E)采用邻接表表示,对于图中的每个顶点还采用了几种附加的数据结构,对每个顶点u∈V,其色彩存储于变量color[u]中,结点u的父母存于变量π[u]中。如果u没有父母(例如u=s或u还没有被检索到),则 π[u]=NIL,由算法算出的源点s和顶点u之间的距离存于变量d[u]中,算法中使用了一个先进先出队列Q来存放灰色节点集合。其中head[Q]表示队列Q的队头元素,Enqueue(Q,v)表示将元素v入队, Dequeue(Q)表示对头元素出队;Adj[u]表示图中和u相邻的节点集合。
  procedure BFS(G,S);
   begin
1.   for 每个节点u∈V[G]-{s} do
        begin
2.        color[u]←White;
3.        d[u]←∞;
4.        π[u]←NIL;
        end;
5.   color[s]←Gray;
6.   d[s]←0;
7.   π[s]←NIL;
8.   Q←{s}
9.   while Q≠φ do
       begin
10.      u←head[Q];
11.      for 每个节点v∈Adj[u] do
12.        if color[v]=White then
              begin
13.             color[v]←Gray;       
14.             d[v]←d[v]+1;
15.             π[v]←u;
16.             Enqueue(Q,v);
              end;  
17.      Dequeue(Q);
18.      color[u]←Black;
       end;
   end;

MATLAB基础应用精讲-【数模应用】基于广度优先搜索的多路径规划(附MATLAB、Java、python和C++代码实现) 图遍历是一种在图中查找顶点的搜索技术。在搜索过程中,还使用图遍历来确定其访问顶点的顺序。在不产生循环的情况下,图遍历会找到搜索过程中要使用的边。也就是说,利用图遍历,您可以访问图的所有顶点,而无需经过循环路径。广度优先搜索或 BFS 算法深度优先搜索或 DFS 算法。 阅读详情

相关推荐

【JavaScript 算法】广度优先搜索:层层推进的搜索策略

广度优先搜索(Breadth-First Search, BFS)是一种用于遍历或搜索图或树数据结构的算法。该算法从起始节点开始,逐层向外扩展,直到找到目标节点或遍历完所有节点。本文将详细介绍广度优先搜索算法的原理、实现及其应用。

Allen- 1197

广度优先搜索和深度优先搜索(迷宫)

广度优先搜索和深度优先搜索 诶,思来想去,还是要关于这个写一篇博客的。(毕竟当初为了看懂这两个东西并且自己写出代码,花了好长好长的时间。)上次蓝桥杯中出现了一道关于迷宫的题目,当时写了好久写不出来,很气,于是下定决心要把这两个东西看看懂。而最近又回到了图论的问题,于是这两玩意又出来了。。 第一次接触DFS,是在《啊哈,C》中 解救小哈 一问题的解决。 先来讲一下这两者的算法思想吧。(这里感谢我...

rain_island的博客 1036

广度优先搜索(BFS)算法:原理与应用

本文深入探讨了广度优先搜索(BFS)算法的原理及其在解决迷宫问题中的应用。通过BFS算法,我们能够确保找到的路径是最短的,因为它按照访问顺序依次探索每个节点的邻居。文章通过图解和实例,解释了BFS的关键操作和队列的使用,以及如何通过优化来避免重复路径,节省搜索时间。

weixin_31776191的博客 391

求二叉树的层序遍历(广度优先搜索算法(BFS:Breadth-First Search))

这个算法从根节点开始,沿着树的宽度遍历节点,直到所有的节点都被访问为止。:我们取出队列中的所有节点(9和20),并将这些节点的值加入结果列表。然后,我们将这些节点的所有子节点(6,15和7)加入队列。:我们取出队列中的所有节点(只有3一个节点),并将这个节点的值加入结果列表。然后,我们将这个节点的所有子节点(9和20)加入队列。所以,第一层的结果是[3]。:我们取出队列中的所有节点(6,15和7),并将这些节点的值加入结果列表。:当队列不为空时,我们取出队列中的所有节点,并将这些节点的值加入结果列表。

qiuchangxingfiber的专栏 693

【Origin+Python】使用External Python批量出图代码参考2

不使用part2 的代码,自己打开一个origin2022的界面。这里主要介绍一些进阶代码以及使用盗版origin要如何。3 批量绘制相同设置的曲线图。然后就是没有水印的图片了。

zeng001201的博客 1908

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5411

C++算法之广度优先搜索算法

广度优先搜索算法是一种常见的图搜索算法,可以用于解决很多实际问题,如寻找最短路径、迷宫问题等。本文会介绍广度优先搜索算法。

现役 OIer。 3039

向NCBI上传16S rDNA数据的操作详解

专门介绍向NCBI上传16S rDNA数据的方法不太多。因为自己有上传数据的需要,所以决定边摸索边写下操作流程。如果这篇博文交代了上传步骤以及一些描述文件属性的书写,帮到你的话,还请点赞收藏。

yue81560的博客 2万+

走迷宫——BFS(广度优先搜索)

BFS广度优先搜索走迷宫例题,代码详细注释版

m0_72760405的博客 797

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

本文从初学者的角度分享的关于Matlab simscape 的基础内容,简单分享了Simscape搭建模型,创建子系统,修改定义参数等内容,为将来深入学习和使用simscape做铺垫。

万金油笑匠的博客 6516

基于深度学习YOLOv8的PCB板缺陷检测系统

基于YOLOv8的PCB板缺陷检测系统,可以有效提高PCB生产过程中的检测效率。未来,我们可以进一步优化模型,结合更多的数据增强策略和先进的网络结构,以适应更复杂的生产环境。为了进行训练,理想的数据集应包含多种不同缺陷类型和不同背景的PCB图像。YOLOv8需要的数据格式为每个图像一个标签文件,每个标签文件包含缺陷的类别及其边界框坐标。运行该界面时,用户可以通过点击按钮选择图像,随后系统将自动检测图像中的PCB缺陷并显示结果。训练完成后,可以使用训练好的模型进行推理,检测新的PCB图像中的缺陷。

YOLO 1070

广度优先搜索(BFS)算法:原理、应用与 Java 实现

广度优先搜索(BFS)是一种重要的图遍历算法,具有广泛的应用场景。通过迭代实现,BFS 可以有效地探索图中的所有节点。

小L的博客 2240

【2024遥感应用组一等奖】基于时空融合和水量平衡法的若尔盖高原水源涵养功能评价

考虑到水源涵养的概念和尺度特征、数据的可获得性、模型的模拟精度等,构建了一种基于遥感、气象和水量平衡原理的草原湿地水源涵养评价方法,估算若尔盖湿地近23年(2000-2022)来的水源涵养量。若尔盖湿地是我国黄河源区的重要水源地,所以本研究以若尔盖湿地的水源涵养功能评估为科学问题,基于遥感数据、GIS数据等,利用水量平衡原理,发展计算简单、便捷、数据易获取的“水源涵养估算方法”,科学估算若尔盖湿地水源涵养服务量,探究其时空动态变化趋势及其影响因素;公式中,Z1和Z2为两个不同高度面的高度,u为摩擦速率;

JData_Engineer的博客 239

【Python搜索算法】广度优先搜索(BFS)算法原理详解与应用,示例+代码

广度优先搜索(Breadth-First Search,BFS)是一种图遍历算法,用于系统地遍历或搜索图(或树)中的所有节点。BFS的核心思想是从起始节点开始,首先访问其所有相邻节点,然后逐层向外扩展,逐一访问相邻节点的相邻节点,以此类推。这意味着BFS会优先探索距离起始节点最近的节点,然后再逐渐扩展到距离更远的节点。BFS通常用于查找最短路径、解决迷宫问题、检测图是否连通以及广泛的图问题。BFS算法的步骤如下:初始化:选择一个起始节点,将其标记为已访问,并将其放入队列中(作为起始节点)。

qq_35831906的博客 1万+

网络安全系列-四十三:使用Suricata分析恶意流量pcap文件

本文基于[网络安全系列-三十六:使用Suricata IDS分析pcap文件]和 [网络安全系列-四十二: Suricata之rulesets的激活、更新及动态加载]的基础上,使用suricata针对包含恶意流量的pcap文件进行分析,触发事件告警,并对suricata输出的日志进行逐个分析,让你掌握针对恶意流量的分析步骤,及怎么查看suricata输出的日志。

penriver的博客 2882

【Dify系列教程重置精品版】第二章:在Windows上部署Dify

让我们的电脑允许使用Linux系统。有点兴奋是怎么回事?简单来说就是让你的电脑拥有另一个叫做Linux的系统。3.选择“适用于Linux的Windows子系统”与 “虚拟机平台”与“Hyper-V"第1章:安装 wsl (Windows Subsystem for Linux)上一章我们聊了什么是Dify,这一章我们讲一下怎么才能用Dify。好了,我们的环境部署好了,下一章我们正式进入Dify。下载完成后,我们直接一直无脑下一步,安装即可。完成上述步骤,我们就可以开始安装wsl了。我们的虚拟化也是开启的。

xiezhipu的博客 866

深入解析队列与广度优先搜索(BFS)的算法思想:原理、实现与应用

深入解析队列与广度优先搜索(BFS)的算法思想:原理、实现与应用

祯的博客 1169

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

BFS(广度优先搜索)算法详解:原理、实现与应用

广度优先搜索(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的算法。它从根节点(或任意节点)开始,逐层地访问所有相邻节点,然后再进入下一层。BFS 的核心思想是“先访问离起点最近的节点”,因此它天然适合解决最短路径问题(在无权图中)。BFS 是一种基础且强大的图遍历算法,其逐层遍历的特性使其成为解决最短路径、扩散、层次遍历等问题的首选。掌握 BFS 的核心实现(队列 + visited 标记)以及其典型应用场景,是算法学习中的重要一环。

QY8765的博客 276

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

广度优先搜索(BFS)算法:从原理到实战的跨领域应用指南

广度优先搜索(BFS)是图论中的基础算法,其核心原理是通过队列实现按层次遍历,确保从起点开始逐层探索所有相邻节点。这种算法思维在技术领域具有重要价值,能够高效解决最短路径、状态可达性等经典问题。在工程实践中,BFS广泛应用于微服务依赖分析、社交网络关系挖掘、任务调度优化等场景。本文结合分布式系统和算法优化等热词,深入解析BFS在复杂系统设计中的实际应用,通过多源BFS、双向BFS等高级技巧,展示如何将基础算法思维转化为解决实际工程问题的有效工具。

weixin_32288959的博客 319

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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

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

猪肉炖粉条的博客 2349

【Python算法实战】广度优先搜索(BFS)核心原理与三大工程级应用场景剖析

本文深入解析了广度优先搜索(BFS)的核心原理及其在Python中的实现,重点探讨了BFS在复杂网络最短路径规划、状态空间搜索与最优解验证、多源BFS与扩散模拟三大工程级应用场景。通过实际代码示例和对比分析,帮助开发者掌握BFS算法在物流配送、游戏AI寻路、拼图游戏解法等领域的实战应用。

weixin_34166472的博客 448

广度优先搜索(BFS)学习笔记

尽管BFS已被广泛应用于多种领域,其理论和实践的发展仍有广阔的空间。随着计算能力的增强和算法理论的深入,预计未来将出现更多创新的BFS变体,这些变体将更加高效、灵活,能够应对更加复杂和动态的应用场景。此外,随着人工智能技术的进步,BFS的自动优化和自我调整能力可能会得到显著提升,使其在未来的技术生态中继续发挥关键作用。通过不断地探索和实验,BFS和其相关技术将继续为解决实际问题提供强大的支持,特别是在信息的组织、处理和分析方面,为科技发展做出重要贡献。

ELovevne的博客 1282

BFS 广度优先搜索算法

广度优先搜索(BFS,Breadth-First Search)是一种用于遍历或搜索树或图的算法。它从根节点(或起始节点)开始,逐层地对节点进行访问,先访问距离起始节点最近的所有节点,然后再依次访问距离更远的节点。下面将从算法原理、代码实现(以图的遍历为例)、复杂度分析和应用场景几个方面详细介绍 BFS 算法。

qq_60429504的博客 353

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

其基本思想是先访问起始顶点,然后逐层遍历其相邻的顶点,直到找到目标顶点或遍历完所有顶点。BFS算法的时间复杂度用 的形式表示O(V + E),其中V是节点数,E 是边数。我们从顶点 0 开始,BFS 算法首先将其放入 Visited 列表中,并将其所有相邻顶点放入堆栈中。接下来,我们访问队列前面的元素(即 1)并访问其相邻节点。顶点 2 在 4 中有一个未访问的相邻顶点,因此我们将其添加到队列的后面并访问位于队列前面的 3。队列中只剩下 4 个节点,因为 3 的唯一相邻节点(即 0)已经被访问过。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 1673

广搜(BFS)

广搜全称叫广度优先搜索,或叫宽度优先搜索,简称BFS。人如其名,他不像深搜一路干到底,而是一层一层的搜索,如图当然,广搜有很多种,这只是广搜和二叉树的结合,不过大体就是像这样,一层一层的搜索。

longxuan01的博客 3650
上一篇: DFS搜索讲解
下一篇: 回溯算法及例题
power721
博客等级 码龄18年 176粉丝 135原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值