广度优先搜索(BFS)

定义

       维基百科:https://zh.wikipedia.org/wiki/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2

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

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

《广度优先搜索(BFS)》

基本实现思想

        (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

    原文作者:codeg
    原文地址: https://www.cnblogs.com/darklights/p/5308840.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞