广度优先算法(BFS)

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

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

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

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

要遍历的图结构:

#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;
}

广度优先遍历结果次序:

接着再来谈使用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的更多相关文章

  1. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  2. 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  3. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  4. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  5. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  6. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  7. 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS

    前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...

  8. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

  9. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  10. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

随机推荐

  1. React后台管理系统 02样式初始化,引入reset-css

    上一篇中,我们已经对项目的整体结构进行了搭建,现在需要对不需要的东西进行删除,最后留下这些东西. 现在需要对全部的样式进行清除,使用命令导入依赖:npm i reset-css 然后在main.tsx ...

  2. 从GaussDB(DWS)的技术演进,看数据仓库的积淀与新生

    摘要:随着云计算的兴起和渗透,云数仓成为了数仓技术演进的新阶段,并且逐渐成为了众多企业的共同选择. 本文分享自华为云社区<从GaussDB(DWS)的技术演进,看数据仓库的积淀与新生>,作 ...

  3. Anchored Neighborhood Regression【阅读笔记】GR全局回归

    论文信息 [Anchored Neighborhood Regression for Fast Example-Based uper Resolution]-TIMOFTER, 2013, IEEE ...

  4. React报错:You are running `create-react-app` 5.0.0, which is behind the latest release (5.0.1).

    错误 解决方案 说白了就是版本过低,升级下就好.或者按照提示卸载掉原来的版本,之后输入临时创建命令即可,如下图所示 参考链接 https://stackoverflow.com/questions/7 ...

  5. PyQt5实时刷新

    对于执行很耗时的程序来说,由于PyQt需要等待程序执行完毕才能进行下一步,这个过程表现在界面上就是卡顿,而如果需要执行这个耗时程序时不断的刷新界面.那么就可以使用QApplication.proces ...

  6. tcpdump抓指定端口/ip的数据包

    抓指定端口,这里以7070端口为例 tcpdump -i ens192 port 7070 -s 0 -l -A -w /chris/70.pcap ens192是网卡  抓完ctrl c停止 抓指定 ...

  7. zabbix触发器标签提取监控项子字符串功能实现对应告警恢复

    0 实验环境 zabbix 6.0 1 监控项 1.1 监控项设置 通过zabbix agent自定义监控项,读取某文件内容模拟日志/trap告警,测试获取触发器标签中提取子字符串功能,以及相同标签的 ...

  8. docker 安装 Influxdb-relay 使用

    转载请注明出处: 1.influxdb relay的作用和特性 数据转发:InfluxDB Relay 可以从一个或多个源(input)接收数据,并将其转发到一个或多个目标(output)的 Infl ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题

    三.请简要地证明:在规模为 n 的子数组上,PARTITION 的时间复杂度为 Θ(n). 文心一言: 首先,我们需要明确PARTITION函数的具体定义.PARTITION函数通常用于快速排序算法中 ...

  10. 使用LabVIEW 实现物体识别、图像分割、文字识别、人脸识别等深度视觉

    前言 哈喽,各位朋友们,这里是virobotics(仪酷智能),这两天有朋友私信问之前给大家介绍的工具包都可以实现什么功能,最新的一些模型能否使用工具包加载,今天就给大家介绍一下博主目前使用工具包已经 ...