青少年编程知识记录 codecoming

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

一、广度优先搜索的过程



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



三、例题



(adsbygoogle = window.adsbygoogle || []).push({});

作者:亿万年的星光 分类:算法 浏览: