我在某个比赛中遇到了这个问题,但一直未能想出解决方案。我的想法是应用迪杰斯特拉算法或其他方法,但并不是很清楚:
“你将得到一个带有所有边都有正权重的城市的加权连通图。一些城市(节点)有加油站,而其他城市则没有。你有一辆油箱容量为C的摩托车。也就是说,油箱加满后,摩托车可以行驶C个单位的距离。在任何一个有加油站的城市里,摩托车都可以加满油箱。找出给定起点和终点之间的最短路径。假设你从满油状态开始。”
我有一种感觉,O(mnlogn)会被接受。
我在某个比赛中遇到了这个问题,但一直未能想出解决方案。我的想法是应用迪杰斯特拉算法或其他方法,但并不是很清楚:
“你将得到一个带有所有边都有正权重的城市的加权连通图。一些城市(节点)有加油站,而其他城市则没有。你有一辆油箱容量为C的摩托车。也就是说,油箱加满后,摩托车可以行驶C个单位的距离。在任何一个有加油站的城市里,摩托车都可以加满油箱。找出给定起点和终点之间的最短路径。假设你从满油状态开始。”
我有一种感觉,O(mnlogn)会被接受。
有一种改进的Dijkstra算法,其中加油站顶点之间的距离是通过另一种修改后的Dijkstra算法按需计算的,该算法在指定范围内搜索所有未解决的加油站顶点。
主Dijkstra循环执行以下步骤:
0. 当主要优先队列为空时退出,提示“无法到达终点”。
1. 从主要优先队列中取出加油站。
2. 如果它是终点,则退出。
3. 调用子Dijkstra来提供与实际加油站的距离未解决的相邻加油站。
子Dijkstra使用自己的优先队列(直到队列为空)搜索从实际加油站到燃料范围内所有顶点的最短路径,并根据其状态处理已到达的加油站:
* 在主要队列中已解决-不处理出边。
* 在主队列中等待-更新距离(当低于decreaseKey时)和路径
* 否则将其放入主队列中。