广度优先搜索(BFS)是最简单的图搜索算法之一。给定一个图G=(V,E)和一个源点s,广度优先搜索对图G中的边进行搜索可以发现所有从源结点s到达的所有结点,并且可以计算从源节点s到每个可以到达的结点的最少边数,同时生成一颗“广度优先搜索树”。
在《算法导论》一书中,作者用了三种结点的颜色(白色,黑色和灰色)来方便讲解和读者理解。所有的结点在一开始的时候均涂上白色,白色代表尚未发现,灰色代表已经发现但是尚未完成扩展,而黑色则代表已经扩展完成(即所有与之邻接的结点均已经被发现)。书中给出的伪代码如下
下面是一个例子
依托上一篇图结构的文章,用Java实现的部分关键代码如下:
/**
*
* 广度优先遍历
*/
public void BFS(int start){
if(checkVertex(start)){
System.out.println("-----------BFS------------");
Queue<Integer> queue = new LinkedList<>();
int[] reached = new int[n+1];
for(int i =0;i<n+1;i++)
reached[i] = 0;
reached[start] = 1;
queue.add(start);
while(!queue.isEmpty()){
int head = queue.poll();
System.out.println(head);
GraphChain list = aList[head];
int node = (int) list.pop();
while(!list.isEmpty()){
if(reached[node]==0){
queue.add(node);
reached[node] = 1;
}
node = (int) list.pop();
}
}
}else{
System.out.println("所选搜索节点超出范围");
}
}