图的深度优先遍历和宽度优先遍历C语言,图的遍历BFS广度优先搜索
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广度优先搜索相关推荐
- 图的深度优先遍历和宽度优先遍历C语言,图的广度、深度优先遍历 C语言
以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: #include #include #include using namespa ...
- 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)
农夫过河游戏规则:在左岸有农夫.狼.羊.菜,农夫需要想办法将狼.羊.菜最终都带到右岸,条件就是农夫不在的时候,狼会吃羊,羊会吃菜,而且每次只能带一样,或者不带. 这里会用到堆栈.队列.列表这样的数据结 ...
- 更换map的遍历顺序优先级_树的级别顺序遍历或宽度优先遍历
更换map的遍历顺序优先级 In this tutorial, we'll be discussing what's Level Order Traversal. Also, we'll be pri ...
- 二叉树层序遍历(宽度优先遍历bfs--队列)
https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-3 ...
- 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)
目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法:三十张图弄懂「图的两种遍历方式」...
原创: 进击的HelloWorld1 引言遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次. 在二叉树基础中,介绍了对于树的遍历.树的遍历是指从根节点 ...
- 网状结构(图)图的存储(邻接矩阵、邻接表)、图的遍历(深度DFS、广度BFS)、图的最短路径
图 多对多关系 是一种网状数据结构,图是由非空的顶点集合和一个描述顶点之间关系的集合组成 其定义 Graph = (V, E) V={x | x ∈某个数据对象} E = {<u, v> ...
- 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)
广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS) 1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first searc ...
- dfs深度优先搜索_图的深度优先搜索(DFS)
dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...
最新文章
- 美团社招Java开发一面,二面,三面,四面合并面经
- 2.easyui 控件取值方式
- 【源码】Word转PDF V1.0.1 小软件,供新手参考
- mysql语句报错1403_GoldenGate SQL error 1403 mapping 错误解决方案
- 小鹏发布会上硬刚特斯拉AutoPilot:有视频有真相,特斯拉不懂中国路况
- 19. 邮件提醒(发送邮件)
- 进程(process)和线程
- 物联网技术的发展历史及关键技术
- 智能写作全景介绍:从最新前沿技术到行业落地解析
- node.js之打包工具webpack
- 错误诊断:索引数据错误导致ORA-00600 [kdsgrp1]处理
- 负margin应用案例几则(转载+总结)
- Zookeeper学习笔记——1 单机版本环境搭建
- TextView属性android:ellipsize实现跑马灯效果
- 关闭恶意无限弹窗的方法
- ascii码值为负数_C语言编程基础学习字符型数据的ASCII码值为何是负数?
- 十首中国现代诗,很美!
- java剑姬_Java虚拟机非常有用的性能监控工具
- [Solved] Pandas--TypeError: ‘bool‘ object is not iterable
- Linux网络设计之实现io_uring用户态接口
热门文章
- TX2Ubuntu16.04上安装 kinectV2
- maven安装本地jar到本地仓库
- C#基础知识之图解TCP IP》读书笔记
- java+phantomjs实现动态网页抓取
- numpy中int类型与python中的int
- 关于AngularJS:
- static_cast、dynamic_cast、const_cast和reinterpret_cast总结(转)
- asp.net MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别
- css字体及css文本控制
- Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式...