图的遍历:广度优先搜索(BFS)
广度优先搜索(Breadth First Search)
广度优先搜索遍历类似于树的按层序遍历
第一个结点A入队,检查与结点A相连的结点B和结点F,结点A已经处理完,将结点A出队,
检查与结点B相连的结点C、结点I、结点G,结点B已经处理完,将结点B出队,
检查与结点F相连的结点G和结点E,结点G已经入队,将结点E入队,结点F已经处理完,将结点F出队……以此类推
1.广度优先搜索遍历连通图
void BFS(Graph G, int v){cout << v; //输入某个顶点在一维数组中的下标visited[v]=true; //访问第v个顶点,并置访问标志数组相应值为trueInitQueue(Q); //初始化队列EnQueue(Q,v); //将下标为v的顶点加入队列while(!QueueEmpty(Q)){ //队列非空DeQueue(Q,u); //队头顶点出队并将其置为ufor(w=FirstAdjvex(G,u); w>=0; w=NextAdjVex(G,u,w)) //这里的FirstAdjVex和NextAdjVex没有具体展开。如果图的存储结构不同,这两个的实现方法不同//依次检查u的所有邻接点w//FirstAdjVex(G,u)表示u的第一个邻接点//w>=0表示存在邻接点//NextAdjVex(G,u,w)表示u的相对于w的下一个邻接点if(!visited[w]){ //w为u的尚未访问的邻接顶点cout << w; //输出已访问过的顶点下标visited[w]=true; //将访问过的顶点标记为trueEnQueue(Q,w); //下标为w的顶点进队}}
}
若是遍历非连通图,上述遍历过程执行完后(只是遍历完一个连通分量),一定还有顶点未被访问(从另一个连通分量的某顶点开始访问),需从图中另选一个未被访问的顶点作为起始点,重复上述过程。
2.广度优先搜索遍历以结构为邻接矩阵的图
无向图
有向图
邻接矩阵存储表示
#define MaxInt 32767 //表示极大值,即无穷大
#define MVNum 100 //最大顶点数
typedef char VerTexType; //顶点的数据类型为字符型
typedef int ArcType; //边的权值类型为整型
typedef struct{VerTexType vexs[MVNum]; //顶点表ArcType arcs[MVNum][MVNum]; //边表(邻接矩阵)int vexnum,arcnum; //图的当前顶点数和边数
}AMGraph;
邻接矩阵的广度遍历
void BFSTraverse(AMGraph G){for(int i=0; i<G.vexnum; ++i) //初始化标志数组visited[i]=false; //初值设为false,即未被访问过InitQueue(Q); //初始化队列for(i=0; i<G.vexnum; ++i){ //遍历邻接矩阵的行if(!visited[i]){ //行标为i对应的顶点未被访问,比如i=0,则对应V_0visited[i]=true;cout << G.vexs[i]; //输出邻接矩阵中行标对应的顶点,比如i=0,则对应V_0EnQueue(Q,i); //行标为i对应的顶点入队while(!QueueEmpty(Q)){ //队列非空DeQueue(Q,i); //行标为i对应的顶点出队/队头顶点出队for(int j=0; j<G.vexnum; ++j){ //遍历邻接矩阵的列if(G.arcs[i][j] == 1 && !visited[j]){ //!visited[j]矩阵中列标对应的顶点未被访问过visited[j]=true;cout << G.vexs[j]; //输出列标j对应的顶点EnQueue(Q,j); //列标j对应的顶点入列}}}}}
}
3.广度优先搜索遍历以结构为邻接表的图
无向图
有向图
图的邻接表存储表示
#define MVNum 100
//单链表中的结点
typedef struct ArcNode{ int adjvex; //顶点的第一邻接点在一维数组中的下标struct ArcNode *nextarc; //指向顶点的下一邻接点OtherInfo info; //边信息,如权值
}ArcNode;
//顶点(存储在一维数组中)
typedef struct VNode{VerTexType data; //顶点信息ArcNode *firstarc; //顶点的第一邻接点
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
//邻接表
typedef struct{AdjList vertices; //一维数组verticesint vexnum,arcnum; //图的当前顶点数和边数
}ALGraph;
邻接表的广度遍历
void BFSTraverse(ALGraph G){p=new ArcNode; //结点指针for(int i=0; i<G.vexnum; ++i) //初始化标志数组visited[i]=false; //初值设为false,即未被访问过InitQueue(Q); //初始化队列for(i=0; i<G.vexnum; ++i){ //遍历邻接矩阵的行if(!visited[i]){ //行标为i对应的顶点未被访问,比如i=0,则对应V_0visited[i]=true;cout << G.vexs[i]; //输出邻接矩阵中行标对应的顶点,比如i=0,则对应V_0EnQueue(Q,i); //行标为i对应的顶点入队while(!QueueEmpty(Q)){ //队列非空DeQueue(Q,i); //行标为i对应的顶点出队/队头顶点出队p=G.vertices[i].firstarc; //指针重命名为pwhile(p){ //指针p所指非空if(!visited[p->adjvex]){ //!visited[p->adjvex]visited[p->adjvex]=true;cout << G.vertices[p->adjvex].data; //输出列标p->adjvex对应的顶点EnQueue(Q,p->adjvex); //列标p->adjvex对应的顶点入列}p=p->nextarc; //现用p指向p->nextarc所指结点}}}}
}
图的遍历:广度优先搜索(BFS)相关推荐
- 图的遍历——广度优先搜索(Breadth First Search)
2019独角兽企业重金招聘Python工程师标准>>> 1.广度优先搜索遍历类似于树的按层次遍历的过程. 假设从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过得邻接点,然 ...
- 图的遍历 --- 广度优先搜索【借助队列实现】 + 深度优先搜索【借助递归栈】
1. >>图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问 一次且仅访问一次. 注意:树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历. ...
- 广度优先搜索c语言矩阵,算法7-6:图的遍历——广度优先搜索 (C++代码)
解题思路: 首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费.因此手动分配空间会更为合理.一种方法是用malloc,对应销毁 ...
- 图的遍历——深度优先搜索+广度优先搜索
一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...
- 邻接表形式存储图并且按广度优先搜索遍历的C语言实现
用邻接表形式存储图并且按广度优先搜索打印遍历结果 #include<stdio.h> #define MAX_VERTEX_NUM 20//最多顶点个数 #define ERROR -1t ...
- 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 算法简介:层层递进----广度优先搜索(BFS)
算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...
- 从零开始的广度优先搜索(BFS)
问题1: 什么是搜索? 搜索,是一个动态的,收集信息,分析信息,保存信息的循环过程.在循环的过程中,我们根据已知的信息,对探索方向进行调整.根据选择探索方向的策略,我们将搜索大致划分为"广度 ...
- 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS
原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...
- 广度优先搜索(BFS)——抓住那头牛(POJ 4001)
本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...
最新文章
- 涨跌因子计算器下载哪里下载_网易超级计算器appv1-网易超级计算器v1下载
- Codeforces round 1083
- 遇见C++ AMP:在GPU上做并行计算
- prop和attr在 jquery的
- 【漫画详解】用iframe障眼法,骗取用户点击
- 【英语学习】【Daily English】U11 Work L02 Just be honest
- 【前端规划】来看看我整理的这一份专属技术知识图谱吧~
- 简单实用的Android ORM框架TigerDB
- 磁盘在linux是什么文件,鸟哥的 Linux 私房菜 -- Linux 磁盘与文件系统管理
- Mish:一个新的state of the art的激活函数,ReLU的继任者
- No.11软件工程的过程管理
- IE8安装flash插件
- NLP--解决Mac OS 10.14.4Python下pip install pyhanlp 失败
- Unable to access jar file xxx.jar问题的解决
- 解决:ERROR: Cannot uninstall ‘certifi‘. It is a distutils installed project and thus we cannot accurat
- BT技术概念 — 一些术语的意思
- python循环:打印小星星
- 【安全】【信息搜集】Google Hacking
- 网红“骗粉”新套路:假装在底层
- SLG游戏性能优化个人总结
热门文章
- AIDE入侵检测系统
- 弘辽科技:手淘搜索其他是什么流量?流量怎么增加?
- Canvas实现网页星空背景粒子动效跟随光标
- PHP调用纯真IP数据库返回具体地址
- 【Linux学习】什么是 inode
- Zigbee无线网络在线心电监测系统
- 电动车控制器 GPS 车充OC2004设计方案参考电路,可替MPS9486
- 广东全国计算机考试准考证
- 使用天地图报错Error in v-on handler: “TypeError: Cannot read property ‘_tdt_events‘ of null
- [架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、制作以及用busybox制作根文件系统