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

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

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

一、广度优先搜索的过程


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




四、其他例题


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

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

    分享给朋友:

    相关文章

    【图论】弗洛伊德算法(Floyd)

    【图论】弗洛伊德算法(Floyd)

    一、算法说明Floyd 算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与 Dijkstra 算法类似。 该算法名称以创始人之一、1978 年图灵奖获得者、斯坦福...

    【算法】最大子段和

    【算法】最大子段和

    【题目描述】给出一个长度位n的序列a,选出其中连续且非空的一段使得这段和最大【输入描述】第一行是一个整数,表示序列的长度n。第二行有n个整数,第i个整数表示序列的第i个数字ai【输出描述】输出一行一个...

    【算法】滑动窗口1—窗口大小固定

    【算法】滑动窗口1—窗口大小固定

    一、定义滑动窗口算法(Sliding Window Algorithm)是一种用于解决数组或字符串中子数组或子串问题的优化技术。它通过维护一个窗口(通常是数组或字符串的一个连续子区间),在遍历过程中动...

    【排序】----插入排序

    【排序】----插入排序

    1.基本思想在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。2.过程·(1)从第一个元素开始,该元素可以...

    【算法】最小重量机器设计

    【题目描述】设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设Wij 是 从供应商j处购得的部件i的重量,Cij 是相应的价格。 试设计一个算法,给出总价格不超...

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

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

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