简谈BFS
BFS的最好理解就是“层次遍历”,他是一层层往下走的。时间复杂度同DFS。

重点在于使用队列来缓存要遍历的结点。
给出核心代码(c++):使用STL中的queue,vex[v][vi] is adjacent matrix
queue<int> que;
que.push(v0); //v0是起始点
while(!que.empty()){
int v = que.front(); //取队头
que.pop(); //出队
for(int vi=;vi<n;vi++){
if(vex[v][vi]){
que.push(vi); //vi入队
}
}
}
BFS可以推广到三维数组,用于计算由像素块组成的三维不规则物体体积、三维物体的连通情况。之前在PAT题目中遇到过一次,在此特别记录一下这样题目的处理方法。
这种题目是二维BFS走迷宫过程的一种扩展。先说一下三维数组的表示以及初始化:
pixel vex[][][];
for(int z=;z<l;z++){
for(int x=;x<n;x++){
for(int y=;y<m;y++){
vex[z][x][y].x = x;
vex[z][x][y].y = y;
vex[z][x][y].z = z;
vex[z][x][y].state = ;
}
}
}
假设v[z][x][y]=1说明这点被像素所填充,这样上面的代码就构造了n*m*l完全被填充的立方体。
再来假设搜索位上下左右前后,那么BFS的方向数组又该如何设计?
int x[] = {,,-,,,};
int y[] = {,,,-,,};
int z[] = {,,,,,-};
那么接下来BFS的核心很好处理了
检验函数,可以很好的避免堆栈溢出~~
bool check(int z,int x,int y){
return tz>= && tz<l && tx>= && tx<n && ty>= && ty<m;
}
que<pixel> vex;
while(!que.empty()){
pixel v = que.front();
que.pop();
for(int i=;i<;i++){
int tz = v.z+z[i]; //求下个点
int tx = v.x+x[i];
int ty = v.y+y[i];
check(tz,tx,ty) continue;
if( vex[tz][tx][ty] ){ //可以到达
que.push(vex[tz][tx][ty]);
}
}
}
以上就是三维物体体积的BFS求解方式。之后再说一个个人观点,二维平面求不规则面积的问题似乎也可以用这种方式解决。
BFS在做层次遍历的时候我们要怎样记录各点所属的层呢?
while(!que.empty()){
vi = que.front();
if(layer[vi] > maxlayer){
maxlayer = layer[vi]; //BFS tree的深度
index = ; //初始化为极大
}
if(vi != v0){
index = min(index,vi); //最深那层中的编号最小的点
}
for(int i=;i<=n;i++){
if(!visit[i] && v[vi][i] != ){
visit[i] = true;
layer[i] = layer[vi]+; //进入了下一层,记录下i点所在的层数
que.push(i);
}
}
que.pop();
}
以上代码是PAT中“喊山”一题的核心代码,很好的诠释了了BFS过程中层次的维护方法。
将来遇到了新问题还会作补充。。。
简谈BFS的更多相关文章
- .NET简谈接口
自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...
- .NET简谈构件系统开发模式
转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...
- .NET简谈——跨进高级编程门槛的必经之路
我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用:为了延续基础知识学习的热情,我编写了这篇特殊的文章. 本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下 ...
- 简谈Java语言的继承
Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...
- 简谈Java语言的封装
简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...
- MPI简谈
MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...
- ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化
首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...
- 简谈HTML5与APP技术应用
HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...
- 简谈WP,IOS,Android智能手机OS
什么是智能手机? 相信到现在这个已经是傻瓜到不能再傻瓜的问题了 智能手机都不懂? 那你活着还有什么意思= = 但是为了谈论今天的三大主角:wp,ios,android 不得不回答一下这个笨笨的问题 如 ...
随机推荐
- 小谢第37问:关于websocket推送进度,本地保存进度条,然后跳出页面进入后再显示的问题
1.主要技术点:sessionStorage 会话存储进度 这里在使用之前,顺便说一下cookie.sessionStorage.localStorage 共同点:都是保存在浏览器端,且同源的. 区别 ...
- 《笨办法学 Python(第四版)》高清PDF|百度网盘免费下载|Python编程
<笨办法学 Python(第四版)>高清PDF|百度网盘免费下载|Python编程 提取码:jcl8 笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机 ...
- Python read和write方法
Python read和write方法: read(): 从文件中读取字符串 注:Python 字符串可以是二进制数据,而不仅仅是文字. 语法: 文件对象.read([count]) count:打开 ...
- yield 复习
1.协程,微型进程: yield 生成器 yield 会保存声明的变量,可以进行迭代 使用 接收函数返回的对象.__next__() next(接收函数返回的对象) .send() 方法 传递给函数中 ...
- PHP array_splice() 函数
实例 从数组中移除元素,并用新元素取代它: <?php$a1=array("a"=>"red","b"=>"gr ...
- PHP log1p() 函数
实例 返回不同数的 log(1+number): <?phpecho(log1p(2.7183) . "<br>");echo(log1p(2) . " ...
- jzyz 题库 题目选做
题库中也有很多我想不出来的模拟赛的题目.做还是必要的.做自己的题目 时间很紧 想想自己的文化课 我又没有那么强 我必须得刷. LINK:水题一道 发现是一道计数题 计数题拿高分的才是王者,但是 计数题 ...
- 2020牛客暑期多校训练营 第二场 I Interval 最大流 最小割 平面图对偶图转最短路
LINK:Interval 赛时连题目都没看. 观察n的范围不大不小 而且建图明显 考虑跑最大流最小割. 图有点稠密dinic不太行. 一个常见的trick就是对偶图转最短路. 建图有点复杂 不过建完 ...
- 实用!一键生成数据库文档,堪称数据库界的Swagger
本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步 最近部门订单业务调整,收拢其他业务线的下单入口,做个统一大订单平台.需要梳理各业务线的数据表,但每个业务线库都有近百张 ...
- 网络安全传输系统-sprint2线程池技术优化
part1:线程池工作原理 为满足多客户端可同时登陆的要求,服务器端必须实现并发工作方式.当服务器主进程持续等待客户端连接时,每连接上一个客户端都需一个单独的进程或线程处理客户端的任务.但考虑到多进程 ...