17.广度优先搜索(BFS)算法

已知图G=(V,E)和一个源顶点s,广度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的广度优先树。

算法首先搜索和s相邻的顶点v,然后再去搜索相邻顶点v的其他相邻顶点。

为了保持搜索的轨迹,广度优先搜索为每个顶点着色:白色、灰色或黑色。算法开始前所有顶点都是白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。在搜索中第一次碰到一顶点时,我们说该顶点被发现,此时该顶点变为灰色。其中灰色和黑色顶点都已被发现。在宽度优先树中,我们称结点u是结点v的先辈或父母结点。因为一个结点至多只能被发现一次,因此它最多只能有--个父母结点。

下面的广度优先搜索过程BFS假定输入图G=(V,E)采用邻接表表示,对每个顶点u∈V,其色彩存储于变量color[u]中,结点u的父节点存于变量π[u]中。如果u没有父节点例如u=s或u还没有被检索到),则 π[u]=NIL,源点s和顶点u之间的距离存于变量d[u]中,算法中使用了一个先进先出队列Q来存放灰色节点集合。其中Enqueue(Q,v)表示将元素v入队, Dequeue(Q)表示对头元素出队;Adj[u]表示图中和u相邻的节点集合。

算法伪代码:

BFS(G,s)

1.    for 每个顶点u∈V[G]-{s}

2.      do color[u]<-WHITE

3.           d[u]<-∞

4.           π[u]<-NIF

5.    color[s]<-GRAY

6.    d[s]<-0

7.    Q<-∅

8.    Enqueue(Q,s)  //将变灰色的点放入Q中

9.    while Q≠∅  //如果Q没有变空就继续循环下去

10.       do u<-Dequeue(Q) //将Q中第一个元素放到u中

11.            for each v∈Adj[u] //u旁的每个相邻顶点

12.               do if color[v]=WHITE

13.                   then color[v]<-GRAY

14.                            π[v]<-u  //放入父节点

15.                            d[v]<-d[u]+1 //距离增加一条边

16.                            Enqueue(Q,v)

17.        color[u]<-BLACK //将父节点或者已经没有子节点的顶点标黑

18.   return π and d

下图就是一个说明:

猜你喜欢

转载自blog.csdn.net/weixin_39653545/article/details/82945479