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

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

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

一、广度优先搜索的过程


    广度优先搜索算法(又称宽度优先搜索算法,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();
   }




四、其他例题


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

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

分享给朋友:

相关文章

【贪心】 导弹拦截

【贪心】 导弹拦截

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

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

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

【算法】归并排序

【算法】归并排序

【参考代码】void msort(int s, int t){ if(s==t) return ;  //如果只有一...

【贪心】----(字典序)最大整数

【题目描述】      设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。       例如:n=3时,3个整...

【算法】二叉树(1):二叉树及其编号

【算法】二叉树(1):二叉树及其编号

0.前言        二叉树(Binary Tree)的递归定义如下:二叉树要么为空,要么由根结点(root)、左子树(left...

【分治】----快速幂

【分治】----快速幂

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