单源BFS是广搜,基于队列的思想,找到初始结点入队,然后把邻接点入队,直到搜索完。

而多源BFS就是,可以多个源点入队,然后每次都将当前入队的所有结点的邻边入队。这次我们核心围绕多源BFS分几种体型来深入探讨。

注:本教学需要先学习 队列和BFS 才能听懂。
我们实际举个例子:假设有个病毒区,每天病毒会传播到临近区域。
现在我们模拟一下
假设 0是正常区,1是病毒区。
粗体表示今天被传播的临近区【入队列】
斜体表示之前被传播过多的病毒区【出队列了】

day0
0 0 0 1 0
1 0 0 0 0
0 0 0 1 0
0 0 0 0 0

day1
1 0 1 1 1
1 1 0 1 0
1 0 1 1 1
0 0 0 1 0

day2
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 0 1 1 1

day3
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

效果显然易见 多源的传播比单源的速度快很多。
那么我们来分析他的 伪代码 运行

//初始化队列 三个源结点推入队列【三个病毒区】
queue q
q.push({0,3})
q.push({1,0})
q.push({2,3})//BFS
while(!q.empty())
{int size=q.size;//先记录当前队列的数量【也就是最新加入的病毒区数量】for(int i=0;i<size;i++){//获取队头并出队 【把粗体变成斜线】{x,y}=q.front();q.pop();//感染四个方向 实际上我们应该特判 【把队头结点的四周的0变成粗体1】//【1:已经感染的区域不用再加入队列了】//【2.边界问题】q.push({x+1,y});q.push({x-1,y});q.push({x,y+1});q.push({x,y-1});}
}

ok这下应该彻底理解了多源BFS了,那么我给你一个C++模板代码
注意模板最好是理解的记忆,不要生搬硬套,更不要CV大法。

     queue<T> q;//初始化源结点for(int i=0;i<vector.size();i++)if(满足条件)q.push(T);//BFSwhile(!q.empty()){int size=q.size();//记录结点数量for(int i=0;i<size;i++){T=q.front();    q.pop();for(周围结点)if(满足条件)q.push(T);}}

那么咱用这个模板去解决一些经典例题吧!
主要就两种类型的,一种是图型,一种是树型。

1162. 地图分析


先来看看图型的,也就是我们刚刚那个病毒区类型的题。

class Solution {public:int maxDistance(vector<vector<int>>& grid) {queue<pair<int,int>> q;int dirx[4]={1,0,-1,0},diry[4]={0,1,0,-1};for(int i=0;i<grid.size();i++)for(int j=0;j<grid[0].size();j++)if(grid[i][j]==1)//是陆地q.push({i,j});int res=-1;if(q.size()==grid[0].size()*grid.size()||q.empty())return -1;//全是陆地或者海洋while(!q.empty())//多源BFS{int size=q.size();for(int i=0;i<size;i++){pair<int,int> p=q.front();q.pop();for(int i=0;i<4;i++){int dx=dirx[i]+p.first,dy=diry[i]+p.second;if(dx>=0&&dx<grid.size()&&dy>=0&&dy<grid[0].size()&&grid[dx][dy]!=1) q.push({dx,dy}),grid[dx][dy]=1;}}res++;}return res;}
};

leecode199. 二叉树的右视图


这是树型多源bfs类型的题目,此时的初始化不是多源而只有树根结点。
但由于树会分左右结点所有还是会多源。

class Solution {public:vector<int> rightSideView(TreeNode* root) {if(root==nullptr)return {};vector<int> res;queue<TreeNode*> q;q.push(root);TreeNode* Parent;//层序遍历?while(!q.empty()){int size=q.size();//cout<<Parent->val<<endl;;for(int i=0;i<size;i++){Parent=q.front();    q.pop();if(Parent->left!=nullptr)q.push(Parent->left);if(Parent->right!=nullptr)q.push(Parent->right);}res.push_back(Parent->val);//root=root->right;}return res;}
};

/
/
/

102. 二叉树的层序遍历


这也是树型多源bfs

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {public:vector<vector<int>> levelOrder(TreeNode* root) {if(root==nullptr)return {};queue<TreeNode*> q;vector<vector<int>> res;q.push(root);while(!q.empty()){vector<int> temp;int size = q.size();for(int i=0;i<size;i++){TreeNode* r=q.front();q.pop();temp.push_back(r->val);if(r->left!=nullptr)q.push(r->left);if(r->right!=nullptr)q.push(r->right);}res.push_back(temp);}return res;}
};

多源BFS 理解学习+代码模板---跟龙之介学算法相关推荐

  1. 【视频课】深度学习入门必修,子欲学算法,必先搞数据!

    前言 欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下: 第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用. 第2层 ...

  2. TLD(Tracking-Learning-Detection)学习与源码理解之(六)

    TLD(Tracking-Learning-Detection)学习与源码理解之(六) zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和这些 ...

  3. TLD(Tracking-Learning-Detection)学习与源码理解之(五)

    TLD(Tracking-Learning-Detection)学习与源码理解之(五)   zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和 ...

  4. TLD(Tracking-Learning-Detection)学习与源码理解之(四)

    TLD(Tracking-Learning-Detection)学习与源码理解之(四) zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和这些 ...

  5. TLD(Tracking-Learning-Detection)学习与源码理解之(三)

    TLD(Tracking-Learning-Detection)学习与源码理解之(三) zouxy09@qq.com http://blog.csdn.net/zouxy09 下面是自己在看论文和这些 ...

  6. TLD(Tracking-Learning-Detection)学习与源码理解之(二)

    TLD(Tracking-Learning-Detection)学习与源码理解之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 OpenTLD下载与编译 ...

  7. rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习

    今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...

  8. 「从源码中学习」面试官都不知道的Vue题目答案

    前言 当回答面试官问及的Vue问题,我们除了照本宣科的回答外,其实还可以根据少量的源码来秀一把,来体现出你对Vue的深度了解. 本文会陆续更新,此次涉及以下问题: "new Vue()做了什 ...

  9. caffe源码c++学习笔记

    转载自:深度学习(七)caffe源码c++学习笔记 - hjimce的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/hjimce/article/details/ ...

最新文章

  1. PyTorch 笔记(02)— 常用创建 Tensor 方法(torch.Tensor、ones、zeros、eye、arange、linspace、rand、randn、new)
  2. Keras学习笔记:序列式模型
  3. OpenCV使用Tensorflow2-Keras模型
  4. O-C相关-08-动态类型与静态类型
  5. 配置quick-cocos2d-x-develop OpenGL version too old
  6. 总结必须学习的10项.NET技术
  7. Pow,Pos,Dpos共识机制比较
  8. python基于协程的网络库gevent、eventlet
  9. matlab机器人画圆
  10. python题库选择题刷题训练_python题库刷题训练开源到了Github
  11. java如何统计txt的字数_Java HashSet对txt文本内容去重(统计小说用过的字或字数)...
  12. 腾讯刷屏!一季度狂赚478亿,员工人均月薪7.6万
  13. kron matlab_Matlab中repelem, repmat, kron重复数组
  14. Chrome浏览器必备插件推荐
  15. 高中数学基础-对数2.2.2对数函数图象及其性质(上)
  16. 经典密码学与现代密码学
  17. 计算机视觉|投影与三维视觉
  18. 网易邮箱VIP注册页面可部分绕过Windows安全中心的验证
  19. linux系统安装vivado软件,vivado 2017下载 Xilinx Vivado HLx 2017.2 在线安装包 官方安装版(附许可证) 64位 Linux版 下载-脚本之家...
  20. 中科院博士论文致谢登上热搜:计算机终成一生事业与希望!网友:他把自己活成了光

热门文章

  1. mac catalina有道词典闪退解决方法
  2. 【SPFA】最长路(洛谷)
  3. java获取7天后的日期_java 获取最近7天 最近今天的日期
  4. 笔记:机器学习的工作流程
  5. Linux-USB驱动笔记(六)--设备驱动框架
  6. 计算机远程用户关机指令,远程关机命令如何操作【详细步骤】
  7. pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练
  8. 第2周项目3多文件组织
  9. 华为u8860 V100R001CHNC00B919版本 无法保存联系人到手机
  10. vue判断是否双击_vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作...