按离起点的层次扩展
从起点出发,先访问一步能到达的邻居,再访问两步、三步能够到达的部分,这就是广度优先搜索的基本次序。层次表达从起点经过的边数;一个顶点可以有多条来路,但首次发现时已经位于最早可达的层。
实现时用先进先出的队列保存已发现、尚未检查邻接表的顶点。取出一个顶点后,把它尚未被访问的邻居标记并入队,直到队列为空,或者所需的终止条件已经成立。
参考:[1]
记录前驱可以恢复路径
发现一个新顶点时,可以记录是从哪一个顶点到达它。沿这些前驱从目标向起点回溯,再反转顺序,便能恢复一条最少边数路径。若存在多条同长路径,邻居的枚举顺序可能决定最后保留哪一条。
这个最短保证针对边数或统一的单位代价。若不同道路的费用不同,经过两条边的路径未必比三条边便宜;普通广度优先搜索不会因为队列按层推进,就自动解决一般带权最短路。
标记与表示决定资源边界
在入队时标记很重要:多条路径指向同一个顶点时,不必把同一份后续工作反复加入队列。图中即使存在环,有限图里的每个顶点仍只需按相应访问规则展开一次。
采用邻接表时,整个遍历的最坏时间为O(V+E),其中V是顶点数、E是边数,队列和访问记录需要与顶点数相关的空间。有向图中必须沿边的方向扩展;起点不可达的顶点不会因存在于同一张图里就自动被访问。