Breadth-First Search ------ 广度优先搜索算法(BFS)

2023-10-28 11:00

本文主要是介绍Breadth-First Search ------ 广度优先搜索算法(BFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

             Breadth-First Search ------ 广度优先搜索算法

所谓广度优先遍历,类似树的按层次遍历,就是一层一层的,向下遍历,层层堵截。

 

1.广度优先搜索的思想: 

  ① 访问顶点vi ; 

  ② 访问vi 的所有未被访问的邻接点w1 ,w2 , …wk ; 

  ③ 依次从这些邻接点(在步骤②中访问的顶点)出发,访问它们的所有未被访问的邻接点; 依此类推,直到图中所有访问过的

点的邻接点都被访问; 

 

2.例子  

广度优先遍历的结果是V1-- V2 -- V3 -- V4 -- V5-- V6 -- V7 -- V8。      

                                            
 

说明: 
为实现③,需要保存在步骤②中访问的顶点,而且访问这些顶点的邻接点的顺序为:先保存的顶点,其邻接点先被访问。 这里我们使用queue队列实现这种先进现出的服务。 

过程:  
1)将 V1 加入队列,取出 V1,并标记为 true (即已经访问),将其邻接点加进入队列,则队内顶点依次为[ V2 V3 ],访问的节点依次为:V1
2)取出 V2,并标记为 true (即已经访问),将其未访问过的邻接点 [ V4 V5 ] 加进入队列,则队内顶点依次为[ V3 V4 V5 ];访问的节点依次为:V1-- V2
3)取出 V3,并标记为 true (即已经访问),将其未访问过的邻接点 [ V6 V7 ] 加进入队列,则队内顶点依次为[ V4 V5 V6 V7 ] ;访问的节点依次为:V1-- V2 -- V3
4)取出 V4,并标记为 true (即已经访问),将其未访问过的邻接点 [ V8 ] 加进入队列,则队内顶点依次为[ V5 V6 V7 V8 ]  ;访问的节点依次为:V1-- V2 -- V3 -- V4
5)取出V5,并标记为 true (即已经访问),因为其邻接点已经加入队列,则无节点入队,队内顶点依次为[V6 V7 V8] ;访问的节点依次为:V1-- V2 -- V3 -- V4 -- V5
6)取出V6,并标记为 true (即已经访问),因为其邻接点已经加入队列,则无节点入队,队内顶点依次为[V7 V8] ;访问的节点依次为:V1-- V2 -- V3 -- V4 -- V5 -- V6
7)取出V7,并标记为true(即已经访问),因为其邻接点已经加入队列,则无节点入队,队内顶点依次为[V8] ;访问的节点依次为:V1-- V2 -- V3 -- V4 -- V5 -- V6 -- V7
8)取出V8,并标记为true(即已经访问),因为其邻接点已经加入队列,则无节点入队,队内顶点依次为[] ;访问的节点依次为:V1-- V2 -- V3 -- V4 -- V5 -- V6 -- V7 -- V8

所以最终结果为:V1-- V2 -- V3 -- V4 -- V5 -- V6 -- V7 -- V8。    

 

3.代码

为什么有第九行的 for 循环,是因为,防止已经第一次选取的u节点的全部相关节点遍历完后,仍然存在一些节点未曾访问到;

如果把第九行的 for 循环和第11行的 if 全部删除,把第一次进队的 v 直接初始化成 V1,也是错误的,原因就是上面那句话

#include <queue>
using namespace std;
....
void BFSTraverse(Graph G)
{//先将其所有顶点都设为未访问状态for (int v=0;v<G.vexnum;v++) visited[v]=false;queue<int> Q;for(int v=0;v<G.vexnum;v++)    {if(visited[v]==false)   //若该点没有访问{Q.push(v);    //将其加入到队列中visited[v]=true;while (!Q.empty())  //只要队列不空,遍历就没有结束{int t =Q.front();  //取出对头元素Q.pop();  //弹出栈顶的元素printf(" %d ",t+1);    //依次输出栈顶的元素就是依次遍历的顺序for(int j=0;j<G.vexnum;j++) //将其未访问过的邻接点加进入队列if(G.arcs[t][j]==1&&visited[j]== false){Q.push(j);visited[j]=true; //在这里要设置true,因为这里该顶点我们已经加入到了队列,为了防止重复加入!}}}}
}

4.时间复杂度

数组表示:查找每个顶点的邻接点所需时间为O(n^2),n为顶点数,算法的时间复杂度为O(n^2)

 

5)应用

用于寻找两个顶点直接最短的距离   ,DFS算法不可

例如,bfs可用于查找两个给定顶点之间边数最少的路径。为此,我们在两个顶点之一处开始BFS遍历,并在到达另一个顶点时立即停止。

例如,图3.12中图表中的路径a−b−c−g在顶点a和g之间的所有路径中的边数最少。

 

                              

 

参考:https://blog.csdn.net/wang725/article/details/82120428

这篇关于Breadth-First Search ------ 广度优先搜索算法(BFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292756

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结