在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索棵发现从s可达的所有顶点,并计算s到这些可达顶点之间的最短边数。
广度优先树,根为s,且包括所有s的可达顶点。树中从s到v的路径对应于图G中从s到v的一条最短路径,即包含最少边数的路径。对有向图无向图都适用。
如果u处于从根s到顶点v的路径中,那么u称为v的祖先,v是u的后裔。
分析
每个顶点至多只进入队列一次,至多只从队列中出来一次。对了列操作所需的全部时间为O(V)。
总运行时间为O(V+E)。
最短路径
定义从顶点s到v之间的最短路径距离δ(s,v)为从s到v的任何路径中最少的边数。如果没有通路则等于OO。
具有这一距离的路径即为从s到v的最短路径。
设G=(V,E)是一个有向图或无向图,s∈V为G的任意一个顶点,则对任意边(u,v)∈V,有:δ(s,v)<=δ(s,u)+1。
设G=(V,E)是一个有向图或无向图,并假设算法BFS从G中某一给定源点s∈V开始执行。在执行终止时,对每个顶点v∈V,BFS所计算出来的d[v]的值满足d[v]>=δ(s,v)。
假设在BFS的执行过程中将顶点vi和vj插入了队列,且vi先于vj入队。那么,当vj入队时,有d[vi]<=d[vj]。
设G=(V,E)是一个有向图或无向图,并假设过程BFS从G上某个给定的源顶点s∈V开始运行。在执行过程中,BFS可以发现原顶点s可达的每一个顶点v∈V。在运行终止时,对所有v∈V,都有d[v]=δ(s,v)。对任意从s可达的顶点v!=s,从s到v的最短路径之一是从s到π(v)的最短路径再加上边(π[v],v)。
广度优先树
如果V_π由从s可达的顶点所构成,则前驱子图G_π是一棵广度优先树,并且对于所有的v∈V_π,在G_π中都有唯一的从s到v的简单路径,该路径也同样是G中从s到v的一条最短路径。
当过程BFS应用于某一有向图或无向图G=(V,E)时,同时要构造出π域,使得前驱子图G_π=(V_π,E_π)是一棵广度优先树。
22.2-1 对图示有向图,当指定源点为3时,所得d和π值是什么。
略
22.2-2 当指定源顶点为u时运行广度优先搜索算法,说明所得的d和π值是什么。
略
22.2-3 如果BFS的输入图是用邻接矩阵表示的,且对该算法加以修改以处理这种输入图表示,那么该算法的运行时间如何?
O(V^2)
22.2-4 试证明在广度优先搜索算法中,赋给顶点u的值d[u]与顶点在邻接表中的次序无关。说明BFS计算出来的广度优先树与邻接表中的顺序是有关的。
d[u]是最短路径,是确定的值。
22.2-5 举例说明,在有向图G=(V,E)中,源顶点s∈V,且树边集合E_π满足对每一顶点v∈V,图(V,E_π)中从s到v的唯一路径是G中的一条最短路径;然而,不论在每个邻接表中各顶点如何排列,都不能通过在G上运行BFS而产生边集E_π。
22.2-6 n个选手,r对比赛,给出O(n+r)的算法,使比赛在好选手与坏选手之间进行。
*22.2-7 树=(V,E)的直径定义为maxδ(u,v),即树中所有最短路径长度中的最大值。
随便找一个点x,搜索距离它最远的点y,再找距y最远的点z。 O(V+E)
*22.2-8 设G=(V,E)是一个连通的无向图。请给出一个O(V+E)时间的算法,以计算图G中的一条路径,对于E中的每一条边,该路径都恰好在一个方向上遍历一次。迷宫如何找出路?