当前位置:首页 > 算法 > 正文内容

【算法】广度优先搜索算法(BFS)

亿万年的星光4年前 (2022-06-25)算法2904

一、广度优先搜索的过程


    广度优先搜索算法(又称宽度优先搜索算法,BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。

    广度优先算法的核心思想是:从初节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点,若没有,再用算符逐一扩展第二层所有节点。如此依次扩展,检查下去,直到发现目标节点为止。即:

  • 从图中的某一顶点v0开始,先访问v0;

  • 访问所有与v0相邻的顶点v1,v2,v3,...,vt

  • 依次访问与v1,v2,...,vt相邻的所有未曾访问过的顶点

  • 循环以往,直至所有的顶点都被访问过为止。


实现方式有 数组模拟队列,和 队列方式实现。

一般走迷宫类型既可以用bfs也可以用dfs,求最短路径类问题用bfs较多。


二、广度优先搜索算法描述

数组版:

int bfs(){
	初始化,初始状态存入队列;
	队列首指针 head=0; 尾指针 tail=1;
	do{
		指针head 后移一位,指向待扩展结点;
		for(int i=1; i<=max;i++){  //max 为产生子结点的规则数 
			if(子结点符合条件){
				tail指针增1,把新结点存入队尾;
				if(新结点与原已产生结点重复)删除该结点(取消入队,tail减1);
				else{
					if(新结点是目标结点) 输出并退出; 
				} 	
			} 
		} 
	} while(head<tail);  //队尾为空 
}

队列版:

queue<数据类型> q;
while(!q.empty){
    int head=q.front();
    q.pop();
    for(枚举)
        if(合法)
            q.push();
   }




四、其他例题


    扫描二维码推送至手机访问。

    版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

    分享给朋友:

    相关文章

    【贪心】----排队打水

    【贪心】----排队打水

    一、基础版排队打水【题目描述】学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。现在有n 名同学准备接水,他们的初始接水顺序已经确定。...

    【算法】动态规划(三)——解题方法与解题思路

    0.前言动态规划最核心的思想就是:拆分子问题,记住过往,减少重复计算。动态规划可以从下面的参考网上的一个例子:A :"1+1+1+1+1+1+1+1 =?"...

    【贪心】 导弹拦截

    【贪心】 导弹拦截

    【题目描述】某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来...

    【贪心】最大子矩阵

    【题目描述】已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1X1)子矩阵。比如,如下4 x 4的矩阵0    -2&...

    【贪心】----最优装载、背包、乘船问题

    【贪心】----最优装载、背包、乘船问题

    1.最优装载题目描述:有n个物体,第i个物体的重量为wi(wi为正整数)。选择尽量多的物体,使得总重量不超过C。【分析】由于只关心选择的物品的最大数量(而不是最大重量,最大重量需要考虑DP),所以装重...

    【算法】动态规划—区间DP问题

    一、定义区间DP是动态规划的一种特殊形式,主要用于解决涉及区间操作的问题,比如合并区间、分割区间、区间匹配等。其核心思想是通过枚举区间的划分点,将大区间的问题分解为小区间的子问题,逐步求解并保存中间结...