1.问题定义
旅游规划问题
2.问题分析
这也是一个典型的求最短路径的问题,可借用图中的Dijkstra算法解决问题,按路径长度递增的顺序依次产生最短路径
3.概要设计
1. 数据结构定义
Edge结构体:用于表示图中的边,包含了边指向的顶点to、边的长度length以及收费额cost。
struct Edge {
int to;
int length;
int cost;
}
2. dijkstra函数
初始化部分:
首先确定图的顶点个数n,然后初始化了三个数组:dist数组用于存储从起点到各个顶点的最短距离,初始化为INT_MAX;cost数组用于存储从起点到各个顶点的最小花费,同样初始化为INT_MAX;visited数组用于标记顶点是否已确定最短路径,初始化为false。并且将起点的最短距离和最小花费都设置为 0。
主循环部分:
通过循环n - 1次来逐步确定每个顶点的最短路径。在每次循环中,先找到未确定最短路径的顶点中距离起点最近的顶点u。
然后将顶点u标记为已访问。
接着遍历顶点u的所有出边,对于每条出边指向的顶点v,计算通过顶点u到达顶点v的新距离new_dist和新花费new_cost。如果新距离小于当前记录的到顶点v的最短距离dist[v],则更新dist[v]和cost[v];如果新距离等于当前记录的最短距离且新花费小于当前记录的最小花费,则更新cost[v]。
3. main函数
首先读取输入的城市个数n、高速公路条数m、出发地城市编号s和目的地城市编号d。
然后创建了一个邻接表graph来存储图的信息,通过循环读取每条高速公路的信息并添加到邻接表中。
最后调用dijkstra函数来计算并输出从出发地s到目的地d的最短路径长度和收费总额。