关于BFS
嗨,又是躺平的一天呢
下文有很多未经版权允许而私自转载,不喜勿喷

今天我来整理亿下关于 BFS 这个“高级”的东西:
首先,我不得不提亿句 关于队列 是个啥
队列(queue)是一种特殊的线性数据结构,队列中的元素也是按照入队顺 序线性的排列。
队列的结构如下图所示,队列只允许在队列的前端(队头)进行删除操作, 后端(队尾)进行插入操作

队列的特点是先进先出(FIFO,First In First Out),即最先入队列的元素 最先出队列,就和我们平时排队一个样子
那么关于队列的实现,我也寥寥的说几句吧

首先值得知道的事是
1.它分为手工队列和STL队列;(这个我们待会讲)
2.front代表队头,rear代表队尾(其实用head和tail也没啥区别)
3.当我们建立初始队列时,要让front和rear都等于0;
4.当在队列尾插入新元素时,让rear++,同样的,每当删除队头元素时,让front++
也就是


但是,他没你想象的那么完美:
看图,你会发现当前队列分配的最大空间为6,队列处于图(d)状态时不可能继续插入新的队尾元素---这种现象为“假溢出”
关于手工队列,它的基本思想就是这样的(我粘贴了老师的代码,不喜勿喷)

关于STL队列,只要提前调用一个queue库,就比较简洁了

那么。我们练道题试试?

代码如下
1 #include<iostream>
2 #include<queue>
3 using namespace std;
4 int main(){
5 int n1,n2;
6 cin>>n1>>n2;
7 int m;
8 cin>>m;
9 queue<int> q1;
10 queue<int> q2;
11 for(int i=1;i<=n1;i++) q1.push(i);
12 for(int i=1;i<=n2;i++) q2.push(i);
13 for(int i=0;i<m;i++){
14 cout<<q1.front()<<' '<<q2.front()<<endl;
15 q1.push(q1.front());
16 q2.push(q2.front());
17 q1.pop();
18 q2.pop();
19 }
20 return 0;
21 }
也就是说,跳过舞的人要退出自己所在的队列,再重新到队列尾部,等待下一次被调用
OK,讲了那么多了,终于可以开始进入正题了——————
关于广度优先搜索(BFS)
其实我觉得他跟深搜有一点点的相同之处,即都是搜索(说了白说),但值得发现的不同是
DFS其实从第一个将节点开始一直往下搜,搜到最深层,接着回溯,回溯到上一个节点进行下一次搜索, 而BFS是一层一层地搜,也就是分层查找:
那么他跟队列有啥关系呢???
就像栈和DFS一样,比如说我有两个父节点1和2,他们的子节点分别为3,4,5和6,7 ,那么我们先将1和2放入队列中,接着进入下一行,把1删去,把他的子节点3,4,5加入队列,再把2删去,把子节点6,7加入进来,这样子就形成了一个队列,其中先进入队列的先出列,后进的自然就后出啦。
还有就是关于它的特点和性质
1.起始状态加入队列,然后每次从队列中取出一个状态,将其后继状态加入队列,后继状态指的是 由当前状态一步操作可以到达的状态,直到所有状态均被访问为止。[结点出队,并伴随扩展入队]
2、它不考虑结果的可能位置,而是彻底地搜索所有状态,所以很少有基于 BFS 的启发式算法,也很少对 BFS 进行剪枝。
3、相对于 DFS,BFS 更加难于保存当前节点的状态,所以 BFS 在爆搜中的应用较少。
4、 在某一层还没有搜索完时,是不会进入下一层的,也就是说在队列中所有同一深度的状态,是连续的一段。(这个性质在之后会用到!)
欧耶!

关于实现,呵呵,我也没办法说,因为我也不会呀呀呀


我也就只能复制粘贴了。。。
OK下面开始开摆吧
请坐稳扶好,题来啦
给出一个n*m的网格,每一个有一个颜色,两个格子之间相连当且仅当,两个格子相连且颜色相同。求联通块的数量。
输入n,m,网格输出数量
下面我来分析一下:
我们可以把每一个元素全都遍历一遍:
先从第一个元素开始,让他入队,再建一个二维数组来记录是否遍历过,如果经过,就把它标记一下,并让下一个(他上下左右的)元素进行判断,如果相同,就让他入队并给他标记,如果四周都不是了,就开始进行下一个。(即重复以上过程,对于已经被标记的元素,直接略过就好了)


哎哎哎,先说到这吧,开摆去了
2022/3/2

关于BFS的更多相关文章
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- 【BZOJ-1656】The Grove 树木 BFS + 射线法
1656: [Usaco2006 Jan] The Grove 树木 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 186 Solved: 118[Su ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
- POJ 2251 Dungeon Master(3D迷宫 bfs)
传送门 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 28416 Accepted: 11 ...
- Sicily 1215: 脱离地牢(BFS)
这道题按照题意直接BFS即可,主要要注意题意中的相遇是指两种情况:一种是同时到达同一格子,另一种是在移动时相遇,如Paris在(1,2),而Helen在(1,2),若下一步Paris到达(1,1),而 ...
- Sicily 1048: Inverso(BFS)
题意是给出一个3*3的黑白网格,每点击其中一格就会使某些格子的颜色发生转变,求达到目标状态网格的操作.可用BFS搜索解答,用vector储存每次的操作 #include<bits/stdc++. ...
- Sicily 1444: Prime Path(BFS)
题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...
- Sicily 1051: 魔板(BFS+排重)
相对1150题来说,这道题的N可能超过10,所以需要进行排重,即相同状态的魔板不要重复压倒队列里,这里我用map储存操作过的状态,也可以用康托编码来储存状态,这样时间缩短为0.03秒.关于康托展开可以 ...
- Sicily 1150: 简单魔板(BFS)
此题可以使用BFS进行解答,使用8位的十进制数来储存魔板的状态,用BFS进行搜索即可 #include <bits/stdc++.h> using namespace std; int o ...
- ACM/ICPC 之 靠墙走-DFS+BFS(POJ3083)
//POJ3083 //DFS求靠左墙(右墙)走的路径长+BFS求最短路 //Time:0Ms Memory:716K #include<iostream> #include<cst ...
随机推荐
- 对于Web性能优化, 了解和经验
我们在发布项目之前压缩CSS和JavaScript源代码,这样文件体积就变小了,用户加载必要资源所花的时间也就更短了. 压缩源码和图片 JavaScript文件源代码可以采用混淆压缩的方式,CSS文件 ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(8) —— 实现Mutate添加数据
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在讨论完GraphQL中的查询需求后,这篇文章我们将演示如何实现GraphQL中的数据添加任务. 思路 在G ...
- 014 Linux 线上高频使用以及面试高频问题——如何查找大文件并安全的清除?
目录 1 案例描述? 2 命令一(目录统计排序最佳命令) 3 命令二(最实用,目录和文件一起统计排序) (1)命令详情和说明 (2)du.head.sort.awk 详细说明参考已有文章附录 (3)L ...
- 巧用python进行接口自动化测试
一.接口自动化测试的流程 1.需求分析 1.1请求(url,方法.数据) 2.挑选需要做自动化测试的接口 3.设计自动化测试用例 4.搭建自动化测试环境 5.设计自动化执行框架(报告.参数化. 用例执 ...
- 【多线程与高并发原理篇:1_cpu多级缓存模型】
1. 背景 现代计算机技术中,cpu的计算速度远远高于主内存的读写速度.为了解决速度不匹配问题,充分利用cpu的性能,在cpu与主内存之间加入了多级缓存,也叫高速缓存,cpu读取数据直接从高速缓存中读 ...
- Solution -「CEOI 2017」「洛谷 P4654」Mousetrap
\(\mathscr{Description}\) Link. 在一个含 \(n\) 个结点的树形迷宫中,迷宫管理者菈米莉丝和一只老鼠博弈.老鼠初始时在结点 \(y\),有且仅有结点 \(x\ ...
- WPF之复选MVVM TreeView(TreeView+CheckBox)
需求背景: 当我们用到权限菜单栏时权限菜单栏属于递归效果,我们需要用到TreeView+CheckBox进行组合复选开发时,我们需要解决此类问题时怎么办,那么就引出今天的小笔记内容 实现方式: 下载M ...
- 羽夏闲谈—— C 语言入门之问
前言 最近加入了一个QQ频道,有很多想学C的纯小白.为什么这么说呢?因为他们会问一些环境用啥?为啥我配置不行?看了教程配置环境我也不会,咋配置?为啥这里代码这里有错误?啥语言好不好?诸如此类的问题 ...
- 从浅入深掌握并发执行框架Executor
引言 任务的执行 大多数并发应用程序都是围绕"任务执行(Task Execution)"来构造的:任务通常是一些抽象的且离散的工作单元. 任务通常是一些抽象的且离散的工作单元.通 ...
- vmstat监视内存的使用情况
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可实时动态监视操作系统的虚拟内存.进程.CPU活动. vmstat的语法 vmstat [-V] [-n] [ ...