定义

维基百科:https://en.wikipedia.org/wiki/Breadth-first_search

给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探索来发现可以从源结点s到达的所有结点。该算法能够计算从源结点s到每个可到达结点的距离(最少的边数),同时生成一棵“广度优先搜索树”。该树以源结点s为根结点,包含所有可从s到达的结点。该算法始终是将已发现结点和未发现结点之间的边界,沿其广度方向扩展,也即是说,算法需要在发现所有距离源结点s为k的所有结点之后,才会发现距离源结点s为k+1的其他结点。

Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。

广度优先搜索(BFS)-LMLPHP

基本实现思想

(1)顶点v入队列。

(2)当队列非空时则继续执行,否则算法结束。

(3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。

(4)查找顶点v的第一个邻接顶点col。

(5)若v的邻接顶点col未被访问过的,则col入队列。

(6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。

(7)直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。

广度优先遍历图是以顶点v为起始点,由近至远,依次访问和v有路径相通而且路径长度为1,2,……的顶点。为了使“先被访问顶点的邻接点”先于“后被访问顶点的邻接              点”被访问,需设置队列存储访问的顶点。

伪代码

(1)初始化队列Q;visited[n]=0;

(2)访问顶点v;visited[v]=1;顶点v入队列Q;

(3) while(队列Q非空)

v=队列Q的对头元素出队;

w=顶点v的第一个邻接点;

while(w存在)

如果w未访问,则访问顶点w;

visited[w]=1;

顶点w入队列Q;

w=顶点v的下一个邻接点。

附:BFS的有趣应用:http://www.cnblogs.com/baiyanhuang/archive/2011/04/17/1999196.html

04-25 16:34