一、问题定义
本次实验为旅游规划问题,即给定一张自驾旅游路线图,其中包含城市间高速公路的长度及收费信息,需编写程序帮助游客找到出发地和目的地之间的最短路径,若存在多条最短路径,则输出最便宜的一条路径。
二、问题分析
- 图的存储结构选择
- 本问题涉及城市间的道路连接关系,是一个图论问题。对于图的存储结构,常见的有邻接表和邻接矩阵。由于城市个数满足,在这种规模下,邻接矩阵和邻接表的复杂度差异不大。考虑到后续算法实现的便利性以及对图结构操作的频繁程度,选择邻接矩阵来存储图更为合适。
- 最短路径算法选择
- 求最短路径有多种经典算法,如 Dijkstra 算法、Floyd - Warshell 算法、Bellman - Ford 算法等。Dijkstra 算法求单源最短路径,时间复杂度为,若要求任意两点间最短路径需外层加循环。Floyd 算法求多源最短路径,时间复杂度为,能一次性求得所有结点间最短路径且算法思想简单。本问题需要求出发地和目的地之间的最短路径,且可能存在多条最短路径需比较收费,Floyd 算法更适合,因为它可以方便地得到所有点对之间的最短路径信息,便于后续比较不同最短路径的收费情况。
- 考虑收费因素的路径选择
- 在找到最短路径后,需要比较多条最短路径的收费情况,选择收费总额最低的路径输出。这需要在计算最短路径的同时,记录路径的收费信息,并在有多条最短路径时进行额外的比较筛选。
三、概要设计
- 数据结构设计
- 城市信息的数据结构:可以设计一个类(例如 City)来存储城市的相关信息,如城市编号、名称(若有需要)等,该类提供相应的 setter 和 getter 方法。
- 图的数据结构
- 定义最大城市数(假设为 MAX_CITY),邻接矩阵(int 类型的二维数组)来存储城市间高速公路的长度信息,另一个二维数组(例如 int 类型的 cost 数组)来存储城市间高速公路的收费信息。
- 还需要记录图的顶点数(城市个数)和边数(高速公路条数)等信息。
- 路径相关的数据结构:可以设计一个数组或列表来存储最短路径的城市序列,方便后续输出路径。同时,可能需要一个变量来记录最短路径的长度和收费总额。
- 算法设计
- 首先使用 Floyd 算法计算所有城市对之间的最短路径长度和对应的路径信息(通过记录前驱节点等方式),在计算过程中同时更新路径的收费信息。
- 然后根据输入的出发地和目的地城市编号,找到对应的最短路径长度和路径信息。
- 如果存在多条最短路径,比较它们的收费总额,选择收费最低的路径输出其长度和收费总额。
四、详细设计(待实验进一步确定和完善)
- 城市信息类的实现
- 具体实现 City 类,包括成员变量(城市编号等)和成员函数(构造函数、setter 和 getter 方法等)。
- 图类的实现
- 实现图类(例如 Graph 类),包括邻接矩阵、收费信息数组、顶点数和边数等成员变量的初始化。
- 实现添加边(高速公路)的方法,在添加边时同时更新邻接矩阵和收费信息数组。
- 实现 Floyd 算法相关的函数,在算法中正确更新最短路径长度和收费信息。
- 路径选择和输出功能的实现
- 实现根据出发地和目的地城市编号查找最短路径的函数,包括处理多路径情况,选择收费最低的路径。
- 实现输出最短路径长度和收费总额的函数,确保格式正确。
五、实验步骤(待实验时详细规划)
- 理解题目要求,分析输入输出格式,设计合理的数据结构。
- 实现图类和相关算法,包括 Floyd 算法的编写和调试。
- 编写主函数,实现输入数据的读取、图的构建、最短路径的计算和输出。
- 进行测试,使用给定的输入样例和自行设计的测试数据,验证程序的正确性。
- 分析实验结果,检查程序是否满足所有要求,如有问题进行调试和优化。
六、预期结果
程序能够正确读取输入数据,构建城市间的图结构,使用 Floyd 算法计算出发地和目的地之间的最短路径长度和收费总额。当存在多条最短路径时,能够准确输出收费最低的路径信息。程序输出格式应符合要求,在一行中输出路径长度和收费总额,数字间以空格分隔,且输出结尾无多余空格。通过测试样例和其他测试数据的验证,程序应能稳定、正确地运行,得到预期的结果。