zoukankan      html  css  js  c++  java
  • 广度优先搜索(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最小生成树算法都采用了和宽度优先搜索类似的思想。

    基本实现思想

            (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

  • 相关阅读:
    BZOJ 1040 (ZJOI 2008) 骑士
    BZOJ 1037 (ZJOI 2008) 生日聚会
    ZJOI 2006 物流运输 bzoj1003
    ZJOI 2006 物流运输 bzoj1003
    NOI2001 炮兵阵地 洛谷2704
    NOI2001 炮兵阵地 洛谷2704
    JLOI 2013 卡牌游戏 bzoj3191
    JLOI 2013 卡牌游戏 bzoj3191
    Noip 2012 day2t1 同余方程
    bzoj 1191 [HNOI2006]超级英雄Hero——二分图匹配
  • 原文地址:https://www.cnblogs.com/darklights/p/5308840.html
Copyright © 2011-2022 走看看