广度优先搜索(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)相关推荐

  1. 图的遍历——广度优先搜索(Breadth First Search)

    2019独角兽企业重金招聘Python工程师标准>>> 1.广度优先搜索遍历类似于树的按层次遍历的过程. 假设从图中某顶点V出发,在访问了V之后依次访问V的各个未曾访问过得邻接点,然 ...

  2. 图的遍历 --- 广度优先搜索【借助队列实现】 + 深度优先搜索【借助递归栈】

    1. >>图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问 一次且仅访问一次. 注意:树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历. ...

  3. 广度优先搜索c语言矩阵,算法7-6:图的遍历——广度优先搜索 (C++代码)

    解题思路: 首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费.因此手动分配空间会更为合理.一种方法是用malloc,对应销毁 ...

  4. 图的遍历——深度优先搜索+广度优先搜索

    一:图的遍历--深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容,更加详细的代码实现及算法分析在此给出. 深度优先搜索(DFS)类似树的先序遍历. 假设初始状态是图中所有顶点未曾被访问,则深 ...

  5. 邻接表形式存储图并且按广度优先搜索遍历的C语言实现

    用邻接表形式存储图并且按广度优先搜索打印遍历结果 #include<stdio.h> #define MAX_VERTEX_NUM 20//最多顶点个数 #define ERROR -1t ...

  6. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  7. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  8. 从零开始的广度优先搜索(BFS)

    问题1: 什么是搜索? 搜索,是一个动态的,收集信息,分析信息,保存信息的循环过程.在循环的过程中,我们根据已知的信息,对探索方向进行调整.根据选择探索方向的策略,我们将搜索大致划分为"广度 ...

  9. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

  10. 广度优先搜索(BFS)——抓住那头牛(POJ 4001)

    本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...

最新文章

  1. 涨跌因子计算器下载哪里下载_网易超级计算器appv1-网易超级计算器v1下载
  2. Codeforces round 1083
  3. 遇见C++ AMP:在GPU上做并行计算
  4. prop和attr在 jquery的
  5. 【漫画详解】用iframe障眼法,骗取用户点击
  6. 【英语学习】【Daily English】U11 Work L02 Just be honest
  7. 【前端规划】来看看我整理的这一份专属技术知识图谱吧~
  8. 简单实用的Android ORM框架TigerDB
  9. 磁盘在linux是什么文件,鸟哥的 Linux 私房菜 -- Linux 磁盘与文件系统管理
  10. Mish:一个新的state of the art的激活函数,ReLU的继任者
  11. No.11软件工程的过程管理
  12. IE8安装flash插件
  13. NLP--解决Mac OS 10.14.4Python下pip install pyhanlp 失败
  14. Unable to access jar file xxx.jar问题的解决
  15. 解决:ERROR: Cannot uninstall ‘certifi‘. It is a distutils installed project and thus we cannot accurat
  16. BT技术概念 — 一些术语的意思
  17. python循环:打印小星星
  18. 【安全】【信息搜集】Google Hacking
  19. 网红“骗粉”新套路:假装在底层
  20. SLG游戏性能优化个人总结

热门文章

  1. AIDE入侵检测系统
  2. 弘辽科技:手淘搜索其他是什么流量?流量怎么增加?
  3. Canvas实现网页星空背景粒子动效跟随光标
  4. PHP调用纯真IP数据库返回具体地址
  5. 【Linux学习】什么是 inode
  6. Zigbee无线网络在线心电监测系统
  7. 电动车控制器 GPS 车充OC2004设计方案参考电路,可替MPS9486
  8. 广东全国计算机考试准考证
  9. 使用天地图报错Error in v-on handler: “TypeError: Cannot read property ‘_tdt_events‘ of null
  10. [架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、制作以及用busybox制作根文件系统