1. 简介

BFS(Breadth First Search,广度优先搜索,又名宽度优先搜索),与深度优先算法在一个结点“死磕到底“的思维不同,广度优先算法关注的重点在于每一层的结点进行的下一层的访问。

2. BFS算法介绍

BFS算法和核心思路就是:从某个点一直把其邻接点走完,然后任选一个邻接点把与之邻接的未被遍历的点走完,如此反复走完所有结点。类似于树的层序遍历。

BFS的核心就是要把当前在哪作为一个状态存储,并将这个状态交给队列进行入队操作,故而,

算法步骤(用队列实现)

a) 访问指定起始点。

b) 访问当前顶点的邻接顶点有未被访问的顶点,并将之放入队列中。

c) 删除队列的队首节点。访问当前队列的队首,前面的步骤。直到队列为空。

d) 若若途中还有顶点未被访问,则再选一个点作为起始顶点。重复前面的步骤。(针对非连通图)。

3. 案例图示

还是这一份例图,我们直接以案例进行讲解,就本图而言,其访问顺序可以是(不唯一):1-2-3-4-5

首先从1开始,1结点处可以访问2,3两个结点,我们访问并以此把两个结点的访问顺序放入队列,然后按照入队顺序(如2,3),之后我们出队状态2,依次访问2结点的下两个结点(4,5结点),并入队4,5结点,再之后我们出队3结点,并依次访问后续,此时发现所有的结点已经被访问完毕了,可以结束搜索,最后我们得到次序:1-2-3-4-5

4. 相关代码

BFS的模板代码如下:/**

* 返回合适的检索数据

*/

int BFS(Node root, Node target)

{

Queue queue;  //创建队列

int step = 0;       // 当前队列的步骤点

// initialize

add root to queue;

// BFS

while (queue is not empty)

{

step = step + 1;

//步数逐渐增加

int size = queue.size();

for (int i = 0; i

{

Node cur = the first node in queue;

if cur is target

return step - 1;

for (Node next : the neighbors of cur)

{//这里常用一个二维方向数组实现

add next to queue;

}

remove the first node from queue;

}

}

return -1;          //出错返回值

}

同样提供一份BFS的图论算法节选,代码最核心还是取记忆BFS的模板并根据实际情况的灵活使用,故以下代码仅提供参考void BFSL(int pos,pGraph G,int visited[30])//从pos点开始进行广度优先遍历无向图

{

int queue[G->Vnum];//队列辅助BFS遍历

int head=0,tail=0;//队头、队尾指针

Arcnode* p;

queue[tail]=pos;

visited[pos]=1;//标记遍历过

tail++;

while(head!=tail)

{

pos=queue[head];//出队操作

head++;

printf("%d ",pos);

p=G->vertice[pos].firstarc;

while(p!=NULL)

{

if(visited[p->adjvex]==0)//判断是否遍历过

{

queue[tail]=p->adjvex;//入队操作

visited[p->adjvex]=1;//标记遍历过

tail++;

}

p=p->next;

}

}

}

5.  应用

BFS算法的实际应用场景,最典型的有地图搜索,迷宫寻路等,需要有“状态”以及状态改变场景的搜索算法,同时BFS由于不需要像DFS算法那样回溯,故比DFS效率可能会更高一些。基于BFS算法的该进算法,比如说R星寻路,DBFS(双向广搜)算法等这类改进算法场景被应用在实际游戏设计,GPS导航设计等场景中。

图的深度优先遍历和宽度优先遍历C语言,图的遍历BFS广度优先搜索相关推荐

  1. 图的深度优先遍历和宽度优先遍历C语言,图的广度、深度优先遍历 C语言

    以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include #include #include using namespa ...

  2. 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)

    农夫过河游戏规则:在左岸有农夫.狼.羊.菜,农夫需要想办法将狼.羊.菜最终都带到右岸,条件就是农夫不在的时候,狼会吃羊,羊会吃菜,而且每次只能带一样,或者不带. 这里会用到堆栈.队列.列表这样的数据结 ...

  3. 更换map的遍历顺序优先级_树的级别顺序遍历或宽度优先遍历

    更换map的遍历顺序优先级 In this tutorial, we'll be discussing what's Level Order Traversal. Also, we'll be pri ...

  4. 二叉树层序遍历(宽度优先遍历bfs--队列)

    https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-3 ...

  5. 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...

  6. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  7. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...

    原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点 ...

  8. 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径

    图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...

  9. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

    广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS) 1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first searc ...

  10. dfs深度优先搜索_图的深度优先搜索(DFS)

    dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...

最新文章

  1. 美团社招Java开发一面,二面,三面,四面合并面经
  2. 2.easyui 控件取值方式
  3. 【源码】Word转PDF V1.0.1 小软件,供新手参考
  4. mysql语句报错1403_GoldenGate SQL error 1403 mapping 错误解决方案
  5. 小鹏发布会上硬刚特斯拉AutoPilot:有视频有真相,特斯拉不懂中国路况
  6. 19. 邮件提醒(发送邮件)
  7. 进程(process)和线程
  8. 物联网技术的发展历史及关键技术
  9. 智能写作全景介绍:从最新前沿技术到行业落地解析
  10. node.js之打包工具webpack
  11. 错误诊断:索引数据错误导致ORA-00600 [kdsgrp1]处理
  12. 负margin应用案例几则(转载+总结)
  13. Zookeeper学习笔记——1 单机版本环境搭建
  14. TextView属性android:ellipsize实现跑马灯效果
  15. 关闭恶意无限弹窗的方法
  16. ascii码值为负数_C语言编程基础学习字符型数据的ASCII码值为何是负数?
  17. 十首中国现代诗,很美!
  18. java剑姬_Java虚拟机非常有用的性能监控工具
  19. [Solved] Pandas--TypeError: ‘bool‘ object is not iterable
  20. Linux网络设计之实现io_uring用户态接口

热门文章

  1. TX2Ubuntu16.04上安装 kinectV2
  2. maven安装本地jar到本地仓库
  3. C#基础知识之图解TCP IP》读书笔记
  4. java+phantomjs实现动态网页抓取
  5. numpy中int类型与python中的int
  6. 关于AngularJS:
  7. static_cast、dynamic_cast、const_cast和reinterpret_cast总结(转)
  8. asp.net MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
  9. css字体及css文本控制
  10. Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式...