首页 > 编程语言 >算法修养--广度优先搜索BFS

算法修养--广度优先搜索BFS

时间:2023-10-15 21:22:30浏览次数:32  
标签:优先 遍历 -- BFS 访问 清单 广度

广度优先算法(BFS)

广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点,这种访问方式类似涟漪泛起,一层一层的扩散。

广度优先算法解决的问题:

  1. 从A点出发,有没有一条路径可以到达B点
  2. 如果有的话,能不能找到最短的路径。
  3. 图/树的遍历

广度优先算法的实现(C++):

要遍历的图结构:

image

#include <iostream>
#include <vector>
#include <queue>

using namespace std;
//Breadth-First Search广度优先遍历
//对图的遍历
//参数:要遍历的图  开始位置
void BFS(vector<vector<int>>& graph,int start)
{
    int size=graph.size();
    vector<bool> visited(size, false);
    queue<int> q;//访问队列

    visited[start]=true;
    q.push(start);

    //按照队列进行选取元素遍历
    while(!q.empty())
    {
        //取出队首的元素
        int node=q.front();
        q.pop();
        //打印
        cout<<"--->"<<node;
        //将该节点的邻居们加入待访问对象队列中
        for(int neighbor:graph[node])
        {
            if(!visited[neighbor])
            {
                q.push(neighbor);
                visited[neighbor]=true;
            }
        }
    }
}

int main() {
    cout<<"---------Breadth-First Search starting---------"<<endl;
    vector<vector<int>> graph={
            {1,2,5},
            {0, 3, 4},
            {0, 3},
            {1},
            {1,5},
            {0,4}
    };
    BFS(graph,0);
    cout<<"end"<<endl;
    return 0;
}

广度优先遍历结果次序:

image

接着再来谈使用BFS来找两个点之间是否有通路。(例如0号和4号)

假如0号同学某日正在刷leetcode题目,题目上说要用BFS来解决,没有学过BFS的他决定去询问好友(好友之间的关系图如上所示),0号与2号、1号和5号是好友,于是他先列了一个清单,准备按照清单逐个访问,当然在找到一个会BFS的人之前要把所有可能问的人都列入清单中。

于是0号把自己的铁哥们(2、1、5)列入清单(队列)上。

然后去访问2号哥们,2号哥们说他也不会,0号说:行,那你说你还认识谁,

于是2号的哥们被列入0号的访问清单上了(入队列)

0号询问2号未果,便查找清单上的下一个访问对象--1号,1号说自己也不会BFS,把他的朋友3号和4号的住址告诉给0号,自然这俩哥们也上了0号的访问清单。

噢,对了。0号是个做事情有条理的人,凡是被访问过的清单上的人物都被划掉了(出队列),然后他继续访问清单上的第三个朋友5,自然5号告诉他你可以去问问4号,0号说1号也跟我说过4号。

于是执着的0号继续访问朋友的朋友们(3号和4号),功夫不负有心人,最终找到4号来解决了今天的leetcode题目。

至此说明,0号和4号之间肯定有一条通路。

再谈使用BFS来找最短路径问题。

为什么0号要固执地访问完身边的朋友之后再去访问朋友的朋友呢?

自己的朋友是是属于一级关系的,0号自然希望自己可以找一个更熟悉的好友来解答问题,倘若自己以及朋友解决不了,再去考虑二级关系。

所以主打的就是一个人脉宽广~!

在找目标点出发的思想就是优先找自己身边的人,自然讲究的成本是最少的。

当然还要考虑路途的距离,路况的好坏,等各种因素,这样使得路途最近的不见得是用时最短的。

这样需要跟BFS进行升级!

敬请期待下一篇算法学习分享!

标签:优先,遍历,--,BFS,访问,清单,广度
From: https://www.cnblogs.com/TonyCode/p/17766207.html

相关文章

  • 【Dotnet篇】Dotnet CLI常用命令
    dotnet--list-sdks//列出已经安装的sdk版本信息dotnet--list-sdksdotnet--list-runtimes//列出已经安装的运行时版本信息dotnet--list-runtimesdotnetnugetlistsource//这会列出当前配置的所有NuGet包源。dotnetnugetlistsource//添加新的NuGet包源do......
  • 眼前一黑
    吃完饭,回到机房,我照例坐在电脑前面用Reader看《魔女之旅》。  H君从身后靠过来,散发着不怀好意的气息摇着我的肩膀,说:“要不要听恐怖故事?超恐怖的哦!”   眼睛直视屏幕的我嗯嗯敷衍,H君便讲了起来。 老实说我根本没在听,讲的故事也没什么恐怖的。  下课时的机房也不是......
  • IT工具知识-19: Dlink Dir-505 刷机以及升级经历
    0.背景最近想找个小巧的路由器当作物联网路由器使用,原本是用随身wifi的,但是随着设备的增多,已经快达到随身wifi可承载设备的极限了,所以就找到了dir-505,原厂自带uboot,所以上传固件很方便.1.准备windows10电脑一台网线一根路由器本体A1G版本(原厂系统)固件:固件地......
  • [网鼎杯 2020 朱雀组]Nmap
    原理nmap写入文件连接木马两个函数绕过escapeshellarg()escapeshellcmd()解题过程文章:https://blog.csdn.net/qq_63701832/article/details/128793013......
  • 第二十三周_周报
    学习时间:10.9-10.15一、完成内容学习方面:跑通了《LearningTrajectoryDependenciesforHumanMotionPrediction》这篇论文的代码。项目方面:实现小程序普通用户的群众意见、政务答复和我的的前端页面,以及积分模块的1/3的页面、除了师兄今天改的文件上传的接口,其他的写了的页......
  • 电机分类
    直流电机有刷电机电刷+换向器线圈在转子上驱动:L298N 无刷电机 线圈在定子上半桥电路 步进电机将脉冲信号转为电机控制,空载低频下精确控制角度(开环控制)    伺服电机信号电压为零时无自转,转速随转矩增加匀速下降常见伺服电机:舵机   ......
  • 学习笔记5
    EXT2文件系统EXT2文件系统数据结构通过mkfs创建虚拟磁盘命令:mke2fs[-bblsize-Nninodes]devicenblocks在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小......
  • 世界纷纷扰扰,总有人在准备校招
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!这段时间相信大家不管是各种资格考试还是准备考公考研,都是忙忙碌碌。当然,也有不少同学在为校招而努力。01校招持续时间长校园招聘是许多大学生毕业后进入职场的重要途......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第五周学习总结
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 设计模式 (2):8 种结构性模式
    回顾上节:随着对象种类、属性容量的扩大,创建具体对象、管理属性装配、快速复制等,都面临难题,这时产生了工厂、建造者、原型等设计模式;单例模式也保护了全局变量,提高了全局访问、使用全局对象和接口的安全性、规范性、可用性等等目录1适配器模式(Adapter)方法依赖别的接......