预计阅读15min
天地不同方觉远,共天无别始知宽。
------------唐·曹松《南海》
广度优先搜索(Breadth-First Search,BFS)是最简单的图搜索算法之一,也是许多重要图算法的原型。prim的最小生成树算法和Dijikstra的单元最短路径算法都使用了类似广度优先搜索的思想。 本文的目的是阐述 BFS 的基本思想,并结合例题进行应用。算法原理 给定图G(V,E) ,V 是节点集合, E是边集合,s为给定的源点。广度优先搜索对图G中的边 进行系统性的搜索来发现可以从源点s到达的所有结点(一个连通枝中的所有节点) 搜索的过程可以理解为按一定的层次来遍历与s之间存在通路的点。即最先访问的若干个点一定是直接与s相连的点,这些点访问完之后,再访问与刚才访问的节点相邻但还未访问的节点,也就是与s距离为2的节点,这样进行下去,直到连通枝中所有的节点都被访问。
算法实现 以上的描述基本就是BFS的算法思想。我们现在看看如何实现。由于我们是要按层次遍历,必须要记住上一层有哪些节点,并且依次访问与这些节点相邻且还未访问的节点。我们要用到的数据结构是 队列,队列具有先进先出的特点,我们每访问一个节点,就把与之相邻的节点放进队列的末尾。 每次从队列中弹出队头的节点,并判断是否访问过,若为否,则标记为已访问,并把与之相邻的节点放入队列中;若为已访问,则丢弃。弹出下一节点。队列为空时结束。这时整个连通枝均已访问。 判断是否访问过也可以放在入队前,已经访问过的节点没必要再入队,因为先前的路径肯定是短一些的。 广度优先搜索的算法框架: 框架1(完全版)
/*假定图G(V,E)是以邻接表储存的。
我们给每个节点赋予一些额外的属性:
u.visited 标记节点u是否访问过。
u.parent 储存u的前驱节点(可用来回溯路径),
没有前驱时parent设为NULL。
u.d用来储存从源节点到u之间的距离。*/
BFS(G,s):
1.初始化变量,对G.V-{s}中的所有节点u