图的bfs和树的bfs类似。与树不同图可能包含环,所以可能再次访问同一顶点。为了避免访问同一顶点多次,我们用一个布尔数组标志顶点是否被访问过。为了简化,我们假定从起始顶点可达所有顶点。
如下图,我们从顶点2开始遍历。当我们遍历到顶点0,查找他的所有相邻顶点。2也是0的一个相邻顶点。如果不标记访问过得顶点,那么顶点2将被再次处理,遍历将变得不可终止。下图的广度优先遍历的结果为2,0,3,1。
下面是广度优先遍历的一个简单实现。图用邻接表表示。List用来存储相邻节点,广度优先遍历需要一个队列。
package com.lixusheng.study.graph;
import java.util.Iterator;
import java.util.LinkedList;
/**
* 这个类用邻接表代表一个有向图
*/
public class MyGraph {
//图的顶点数
private int v;
//邻接表
private LinkedList<Integer>[] adj;
//构造方法
public MyGraph(int v){
this.v = v;
adj = new LinkedList[v];
for