小结
本章介绍了图的抽象数据类型,以及一些实现方式。如果能将一个问题用图表示出来,那么就可以利用图算法加以解决。对于解决下列问题,图非常有用。
-
利用宽度优先搜索找到无权重的最短路径。
-
利用 Dijkstra 算法求解带权重的最短路径。
-
利用深度优先搜索来探索图。
-
利用强连通单元来简化图。
-
利用拓扑排序为任务排序。
-
利用最小生成树广播消息。
讨论题
-
画出以下邻接矩阵对应的图。
-
画出符合以下条件的图。
-
忽略权重,针对讨论题1中的图进行宽度优先搜索。
-
在代码清单7-3 中,buildGraph 函数的时间复杂度是多少?
-
推导出拓扑排序算法的时间复杂度。
-
推导出强连通单元算法的时间复杂度。
-
将 Dijkstra 算法应用于讨论题 2 中的图,展示每一步。
-
利用 Prim 算法为讨论题 1 中的图找到最小生成树。
-
画出发送电子邮件所需步骤的依赖图,并应用拓扑排序算法。
-
推导出骑士周游问题算法的时间复杂度中底数的表达式。
-
解释通用深度优先搜索不适用于骑士周游问题的原因。
-
推导出 Prim 算法的时间复杂度。
编程练习
-
修改深度优先搜索函数,以进行拓扑排序。
-
修改深度优先搜索函数,以计算强连通单元。
-
为 Graph 类编写 transpose 方法。
-
使用宽度优先搜索实现一个算法,用以计算从每一个顶点到其余所有顶点的最短路径。这被称为所有对最短路径。
-
使用宽度优先搜索修改第 4 章中的迷宫程序,从而找到走出迷宫的最短路径。
-
写一个程序来解决这样一个问题:有 2 个坛子,其中一个的容量是 4 加仑,另一个的是 3 加仑。坛子上都没有刻度线。可以用水泵将它们装满水。如何使 4 加仑的坛子最后装有 2 加仑的水?
-
扩展练习 6 中的程序,将坛子的容量和较大的坛子中最后的水量作为参数。
-
写一个程序来解决这样一个问题:3 只羚羊和 3 只狮子准备乘船过河,河边有一艘能容纳 2 只动物的小船。但是,如果两侧河岸上的狮子数量大于羚羊数量,羚羊就会被吃掉。找到运送办法,使得所有动物都能安全渡河。