算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础
广度优先搜索(Breadth First Search)用于按离始节点距离、由近到远渐次访问图的节点,可视化BFS
通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue)
最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance:
// LeetCode 690. Employee Importance
/*
class Employee {
public:
int id;
int importance;
vector<int> subordinates;
};
*/
// Input: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1 Output: 11
class Solution {
public:
int getImportance(vector<Employee*> employees, int id) {
int res=;
unordered_map<int,Employee*> m;
for(Employee* e:employees) m[e->id]=e;
queue<Employee*> q;
q.push(m[id]);
while(!q.empty()){
Employee* cur=q.front();q.pop();
res+=cur->importance;
for(auto s:cur->subordinates) q.push(m[s]);
}
return res;
}
};
相关LeetCode题:
513. Find Bottom Left Tree Value 题解
拓扑排序(Topological Sort)也应用了BFS遍历思想、以达成按依赖关系排序的目的,关于拓扑排序见:算法与数据结构基础 - 拓扑排序(Topological Sort)
层信息
BFS思路是从某节点层层往外扩展,一些场景下我们需要处理层(level)相关的信息,例如 LeetCode题目 102. Binary Tree Level Order Traversal:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root==NULL) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
int size=q.size();
vector<int> tmp;
for(int i=;i<size;i++){ //处理当前level
TreeNode* cur=q.front();q.pop();
tmp.push_back(cur->val);
if(cur->left) q.push(cur->left);
if(cur->right) q.push(cur->right);
}
res.push_back(tmp);
}
return res;
}
};
以上代码不单遍历了树节点,还加了按层(level)处理,注意以上代码与遍历代码的细微差别。
相关LeetCode题:
102. Binary Tree Level Order Traversal 题解
429. N-ary Tree Level Order Traversal 题解
111. Minimum Depth of Binary Tree 题解
993. Cousins in Binary Tree 题解
515. Find Largest Value in Each Tree Row 题解
最短距离
BFS另一个重要的应用就是求最短路径,可以是单点到单点、单点到多点、多点到多点之间的路径。
当问题出现最小(minimum)、最短(shortest)等字样时可考虑用BFS求解,一般求解思路是 1/找出满足条件的起始点,2/由起始点开始进行BFS,3/遇到终点结束。
相关LeetCode题:
以上例题路径之间没有差别,更复杂的一种情况是路径具备权重。对有权图求解最短路径,一般情况下会想到Bellman-Ford、Dijkstra算法,而BFS思想是这些算法思想的核心。
相关LeetCode题:
因问题不同、访问临近节点的方式各异,在使用BFS时我们可能会遇到重复访问某一节点的情况。
为了避免重复访问节点造成死循环,常用hashtable来记录节点是否已经被访问。
相关LeetCode题:
864. Shortest Path to Get All Keys 题解
算法与数据结构基础 - 广度优先搜索(BFS)的更多相关文章
- 算法与数据结构基础 - 深度优先搜索(DFS)
DFS基础 深度优先搜索(Depth First Search)是一种搜索思路,相比广度优先搜索(BFS),DFS对每一个分枝路径深入到不能再深入为止,其应用于树/图的遍历.嵌套关系处理.回溯等,可以 ...
- 算法与数据结构基础 - 图(Graph)
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 算法与数据结构基础 - 队列(Queue)
队列基础 队列具有“先进先出”的特点,用这个特点我们可以用它来处理时间序列相关或先后次序相关的问题,例如 LeetCode题目 933. Number of Recent Calls,时间复杂度O(1 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
随机推荐
- 在本地安装RabbitMQ Server教程以及可能遇到的问题及解决办法
1. Download latest erlang OTP platform from : erlang:http://www.erlang.org/download.html (The latest ...
- python发送邮件554DT:SPM已解决
说明:本例使用163邮箱 一.报错信息 使用SMTP发送邮件遇到以下报错: 554, b'DT:SPM 163 smtp10,DsCowACXeOtmjRRdsY8aCw--.21947S2 1561 ...
- BDC
TC:SHDB 复制到应用处并更改参数. 附上部分代码 * Batchinputdata of single transaction DATA: bdcdata LIKE bdcdat ...
- js简单对象List自定义属性排序
简单对象List自定义属性排序 <script type="text/javascript"> var objectList = new Array(); functi ...
- Spring Cloud Gateway使用
简介 Spring Cloud Gateway是Spring Cloud官方推出的网关框架,网关作为流量入口,在微服务系统中有着十分重要的作用,常用功能包括:鉴权.路由转发.熔断.限流等. Sprin ...
- AcWing 164. 可达性统计
给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到y的一条有向边. 输出格式 输出共N行,表示每个点能 ...
- vue 开发webapp 手机返回键 退出问题
vue 开发webapp 手机返回键 退出问题 mui进行手机物理键的监听 首先安装 vue-awesome-mui npm i vue-awesome-mui 在main.js注册 在index.h ...
- JCS学习记录 --Java Caching System
Java Caching System--JCS 缓存工具 //jcs版本 jcs-1.3.jar //jcs--cache.ccf缓存配置文件 cache.ccf //所依赖的jar包concurr ...
- bower工具
1.安装bower npm install bower -g 2.安装软件 borwer install jquery 3.安装指定版本 borwer install jquery#1.7 4.卸载软 ...
- 网络虚拟化基础协议·Geneve
[分层] 要实现网络虚拟化,最基础的技术肯定是分层(OverLay & UnderLay). ·UnderLay 中文释义中,老房子漏雨,在房子里面撑一把大雨伞,这把大雨伞就是UnderLay ...