算法导论第三版 22.2 广度优先搜索 练习题答案全解析

1——2:略

3. 使用单个位来表示颜色,单个位只能表示位0/1,因此颜色只有白和灰,黑色无法表示,因此删除第十八行对每个结点扫描结束后赋值为黑色的一行代码。

证明:直接一想就可以,代码第十三行,v.color==WHITE才会进行处理,灰色同样不处理,而算法最后之所以设置为黑色,是为了在研究算法的过程中给出一个更加形象的说明而已。

 

4. 如果换成邻接矩阵的话,BFS的时间复杂度将变为多少

 

如果换成邻接矩阵,在扫描队列中结点i的时候,必须将mat(i,-)这一行所有的结点都扫描1遍,复杂度为O(V),而扫描队列中每个结点,因此复杂度为O(V^2)

 

5. 证明:在广度优先算法里,赋给结点uu.d值与结点在邻接链表里出现的次序无关。使用下图为例子,证明:BFS所计算出来广度优先树可以因邻接链表中的次序不同而不同。

 算法导论第三版 22.2 广度优先搜索 练习题答案全解析_第1张图片

证明:①即使在邻接链表出现的次序不同,根据广度优先搜索的算法,这些结点的u.d值都是u.pai.d+1pai一概表示为先驱结点),因此与次序无关。

②广度优先树也是前驱子图。读者可行根据上图进行证明,过于简单不再细细解释,提示:t,x在链表中的不同顺序可能会导致生成两种不同的树。

 

6. 请你举出一个图和一个树边的例子,图中源点到某一点的最短路径也是树边中的一条简单路径,但是无论在邻接链表中结点的顺序怎么排列,都无法通过BFS找到这树边。

算法导论第三版 22.2 广度优先搜索 练习题答案全解析_第2张图片算法导论第三版 22.2 广度优先搜索 练习题答案全解析_第3张图片

    

就这样一个图,无论25在结点1中的顺序如果,都无法找到以下树边:

 

因为在BFS中,34总会连在同一个结点上。

 

7. 根据时间复杂度为O(n+r)很明显可以看出这是一个BFS的应用,对BFS稍加修改就可以对链表进行处理分出娃娃脸型和高跟鞋型。

 

8. 给出一个有效算法来求树的直径,树的直径就是树的所有最短路径中的最大值。

宽度优先搜索算法恰好可以求最短路径,从树的根节点s开始运行BFSGs),找出最后一个结点u,然后再运行以此BFS算法BFSG,u),这次找到宽度优先搜索的最后一个结点vv.d值就是树的直径。时间复杂度等同于BFSO(V+E),在官方给出的答案中这里的时间复杂度为O(V),因为在树中边的数量和结点的数量是相关的(|E| = |V|-1),因此此处的时间复杂度进一步简化可以简化到O(V)

 

9. G为一个连通无向图,给出一个算法在OV+E)时间内计算图G中这样一个路径:该路径正反通过E中每条边恰好正反一次。

 

G为一个无向图,找一个路径正好正反通过E中每条边,这个很像一个欧拉回路的问题。也类似与用BFS生成一个树。

Make_Path(u){

u开始,如果G中存在u——v的路径并且v不在树中,则创建一个到v再返回u的环,这时候相当于设置v.pai = u

然后遍历每个u——vv,如果v不等于u.pai,则创建一条到v的路径并执行Make_Path(v);

算法最后执行路径回到u.pai

}

举个例子:

算法导论第三版 22.2 广度优先搜索 练习题答案全解析_第4张图片最后可以得出一条路径A B A C D E D C E C A 

你可能感兴趣的:(algorithms)