zoukankan      html  css  js  c++  java
  • 图的广度优先遍历

    广度优先遍历是最简单的图搜索算法之一,也是许多重要的图算法的模型。

    图的表示

    对于图G=(V,E)(V代表图中结点的集合,E代表图中所有边的集合),可以用两种标准表示方法表示:

    1.将图作为邻接链表的组合

    对于图G=(V,E),其邻接链表表示由一个包含|V|条链表的数组Adj构成。

    对于每个结点u∈V,邻接链表Adj[u]包含图G中所有与u邻接的结点

    2.将图作为邻接矩阵来看待

    对于邻接矩阵表示来说,我们将图G的结点编号为1,2,...,|V|,用一个|V|×|V|的矩阵来表示图G,该矩阵满足下述条件:

    下面分别展示了有向图跟无向图的两种表示方法

         

    广度优先遍历

    广度优先遍历的基本思想如下:

    1、从图中某个顶点V0出发,并访问此顶点;

    2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;

    3、重复步骤2,直到全部顶点都被访问为止。

    首先我们把图中的每个结点都涂成白色。在算法推进过程中,当第一次遇到该结点时,其颜色会发生改变而且符合下面条件:

    所有与黑色结点邻接的结点都已经被发现,而对于灰色结点来说,其邻接结点中可能存在未被发现的白色结点。

    假定输入图G=(V,E)是以邻接链表锁表示的,下面给出了广度优先搜索过程BFS的伪代码

     1 BFS(G,s)
     2 for each vertex u∈G.V-{s}
     3     u.color=WHITE
     4     u.d= 5     u.π=NIL
     6 s.color=GRAY
     7 s.d=0
     8 s.π=NIL
     9 Q=10 ENQUEUE(Q,s)
    11 while Q≠∅
    12     u=DEQUEUE(Q)
    13     for each v∈G.Adj[u]
    14         if v.color=WHITE
    15             v.color=GRAY
    16             v.d=u.d+1
    17             v.π=u
    18             ENQUEUE(Q,v)
    19     u.color=BLACK

    其中每个加点的颜色存放在属性u.color中,u的前驱结点存放在属性u.π中,属性u.d记录从源结点s到结点u之间的距离,用一个先进先出的队列Q来管理灰色结点集。

    下图描述的是BFS在一个样本图中的推进过程

    把结点涂成灰色是为了方便查看推进的顺序,实际算法中只需要涂成白色或者黑色。

  • 相关阅读:
    Java中常用的四种线程池
    Java中线程与堆栈的关系
    Java线程池构造参数详解
    Java中三目运算符不为人知的坑
    Java并发编程实战 之 对象的共享
    Java并发编程实战 之 线程安全性
    【图文教程】Eclipse for PHP+XAMPP调试配置
    Spket在Eclipse下的安装和配置(图文教程)
    JavaScript编码规范
    FizzBuzzWhizz游戏的高效解法
  • 原文地址:https://www.cnblogs.com/runnyu/p/4689667.html
Copyright © 2011-2022 走看看