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

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

亿万年的星光3年前 (2022-06-25)算法2360

一、广度优先搜索的过程


    广度优先搜索算法(又称宽度优先搜索算法,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的区间,再给出n条线段的起点和终点(本题考虑闭区间),求最少使用多少线段可以将整个区间完全覆盖。【输入】第一行是区间长度m。第二行是n,表示有n个可选区间。后面跟着n行数据...

【排序】----选择排序

【排序】----选择排序

1.基本思想每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列最前,直到全部待排序的数据排完。2.过程首先初始化最小元素索引值为首元素。依次遍历待排序数列,遇到小于该最小索引...

【贪心】----基本概念

一、基本概念所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪...

【分治】----快速幂

【分治】----快速幂

1.幂幂(power)是指乘方运算的结果。n^m指该式意义为m个n相乘。把n^m看作乘方的结果,叫做n的m次幂,也叫n的m次方。2.幂的数学表示和规则2^3  *   2...

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

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

【算法】博弈论——取石子游戏

【题目描述】有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取...