算法修养--广度优先搜索BFS
广度优先算法(BFS)
广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点,这种访问方式类似涟漪泛起,一层一层的扩散。
广度优先算法解决的问题:
- 从A点出发,有没有一条路径可以到达B点
- 如果有的话,能不能找到最短的路径。
- 图/树的遍历
广度优先算法的实现(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的更多相关文章
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
随机推荐
- 本地python调试 问题笔记
ImportError: cannot import name 'int_classes' from 'torch._six' 把 "from torch._six import stri ...
- JVM之指针压缩
做java开发的同学一般都比较熟悉JVM,那么关于指针压缩这块内容是不是也了解呢,不熟悉的小伙伴往下看吧. 首先说明,本文涉及的JDK版本是1.8,JVM虚拟机是64位的HotSpot实现为准. ja ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(二):Spring-IOC-DI
上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(一):SpringIOC概述 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(三):Spring实现 ...
- MASA Blazor中MSwitch如何实现二次确认
<MSwitch @bind-Value="switch" Readonly OnClick="OnClick"> </MSwitch> ...
- Linux 文件系统的设计
一 硬盘的最小存储单元是扇区,扇区大小为512B 文件系统将硬盘划分为固定大小的块(block),最常见的块大小为4KB 块是文件系统读写硬盘的最小单位 二 文件系统设计面临的基本问题: 用户怎么找到 ...
- 关于 Task 简单梳理(C#)【并发编程系列】
〇.前言 Task 是微软在 .Net 4.0 时代推出来的,也是微软极力推荐的一种多线程的处理方式. 在 Task 之前有一个高效多线程操作类 ThreadPool,虽然线程池相对于 Thread, ...
- 这些年写过的花式sql - 第3句 今日流失用户
第3句 今日流失用户 需求: 当日流失用户的定义:昨天登录的,今天没登录的用户数 有一张用户登录日志表,有字段 date_stamp(日期时间戳),用户id(uid).如果用户在某天登录了,该表会有一 ...
- ES6之清楚明白的使用类(class)
定义 类是构造函数.原型链的语法糖. 定义类有两种方式 class Student { } var Student = class { } 某些浏览器可能无法解析es6及以上的语法,这时候需要通过ba ...
- c#如何使用WASM跨语言调用?
介绍Wasm(WebAssembly) WebAssembly(简称Wasm)是一种用于基于堆栈的虚拟机的二进制指令格式.Wasm被设计为编程语言的可移植编译目标,支持在web上部署客户端和服务器应用 ...
- MongoDB索引操作和执行计划Explain()详解
一.索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例. 字段内容如下: { "_id" : ObjectId("63 ...