简谈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 不得不回答一下这个笨笨的问题 如 ...
随机推荐
- Oracle版本发布规划 (文档 ID 742060.1)
Oracle Database Release Schedule of Current Database Releases (文档 ID 742060.1) Oracle Database RoadM ...
- 虚拟DOM Vitural DOM Tree
提起Virtual DOM,总是给人一种高深莫测的感觉,大家都知道它比DOM快.那么Virtual DOM到底是何方神圣呢?在深入理解Virtual DOM之前,先让我们回顾一下DOM. 一.什么 ...
- Zabbix4.x如何安全传输数据
由于设备都在混合云,所以不少数据传输是通过公网,这样极大的增加了危险性,所以在Zabbix数据传输这块则进行PSK安全认证,由proxy主动收集agent数据后统一发送给server,这样只需要对pr ...
- python多进程之multiprocessing
什么是多进程? 简单的理解:单板上运行的一个程序就是一个进程.进程是操作系统分配资源的最小单位,不同的进程之间资源不共享,进程间通信需要使用特定的方式.python提供了自带的multiprocess ...
- STL源码剖析:配接器
启 配接器就是适配器 STL中的适配器一共三种: 迭代器适配器 是一种观念上的改变,如将赋值操作变成插入,前进变成后退,等 函数适配器 STL中最广泛的配接器群体 可以实现连续配接 配接操作:bind ...
- 将数组内的元素循环左移P个位置
问题可以转化为将数组内前 n 个元素进行逆置,再将后(n-p)个元素逆置,最后将整个数组逆置 void Reverse(int A[],int pos1,int pos2){ // 将A[pos1]与 ...
- python基础--迭代器、生成器
(1)迭代器 可迭代对象和迭代器的解释如下: ''' 什么是对象?Python中一切皆对象,之前我们讲过的一个变量,一个列表,一个字符串,文件句柄,函数名等等都可称作一个对象,其实一个对象就是一个实例 ...
- 监督学习-KNN最邻近分类算法
分类(Classification)指的是从数据中选出已经分好类的训练集,在该训练集上运用数据挖掘分类的技术建立分类模型,从而对没有分类的数据进行分类的分析方法. 分类问题的应用场景:用于将事物打上一 ...
- Jquery日历编写小练习
日历练习 总体效果展示: 代码展示: 源代码部分 <body> <!-- 日历--> <div class="div_sty"> <tab ...
- 富文本数据 解析HTML
后台返回给前端的富文本数据如: { "status": 1, "info": "获取活动数据成功", "data": [ ...