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过程中层次的维护方法。

将来遇到了新问题还会作补充。。。

最新文章

  1. [node.js 学习]1.start a simple server
  2. 反射在ADO.NET中的运用(你还在每个项目中循环遍历DataTable吗)
  3. 【转】C#判断奇偶数的函数
  4. frame 之间访问
  5. HTML兼容总结
  6. poj2823:单调队列入门题
  7. 14.19 InnoDB and MySQL Replication InnoDB 和MySQL 复制:
  8. Failed to sync Gradle project &#39;XX&#39;错误解决
  9. 熟悉的“if __name__ == &#39;__main__&#39;:”究竟是啥?
  10. typora画图
  11. Go 初体验 - 并发与锁.2 - sync.WaitGroup
  12. 常见的HTTP响应状态码解析
  13. HMACSHA1 加密算法
  14. loadrunner基础学习笔记五-场景
  15. 20.pipe
  16. element-ui Message组件源码分析整理笔记(八)
  17. Unity Frame Debugger连接Android真机调试
  18. visual studio 2017 报错 无法下载安装文件。请检查Internet连接,然后重试
  19. docx4j基本操作
  20. bzoj1008 / P3197 [HNOI2008]越狱

热门文章

  1. faker生成器生成虚拟数据的Python模块
  2. xenomai内核解析之信号signal(二)---xenomai信号处理机制
  3. node.js02 安装Node环境
  4. Vue.js +pdf.js 处理响应pdf文件流数据,前端转图片预览不可下载
  5. 年薪50W京东软件测试工程师的成长路——我们都曾一样迷茫
  6. 题解 洛谷 P3710 【方方方的数据结构】
  7. 线上CUP负载过高排查方法
  8. pandas之数值计算与统计
  9. 萌新学渗透系列之Hack The Box_Lame
  10. python学习笔记1 -- 面向对象编程类和实例