已知图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
下图就是一个说明: