估计很多初学者对这个问题一直不明白,为什么使用 BFS 进行广度搜索,一定可以搜索到最短路径。
讲真,在学校里学习 BFS 的时候,自己也没完全明白为什么。老师这么教,课本这么写,我就这么记。
其实回答这个问题很简单,请大家仔细观察下图,也就是使用 BFS 完成对树的搜索。比如,我要搜索节点 A 到节点 G 的最短路径。如下动图所示:
在 BFS 中,我们使用了数据结构中的一个队列(queue),我们知道队列的特性是 FIFO(First In First Out),也就是先进先出。正是这个
广度优先搜索(BFS)的数据结构是队列queue。算法思路是用vector来记录每层结点,然后清空当前队列,再将该层队列的下一层加入队列。
算法思路:
public class BreadthFirstPaths {
private boolean[] marked; // 到达该顶点的最短路径已知吗?
private int[] edgeTo; // 到达该顶点的已知路径上的最后一个顶点
private final int s; // 起点
public BreadthFirstPat