我将使用什么算法来实现修改后的图搜索问题?
What algorithm would I use to implement a modified graph search problem?
一次有加油站无限汽油和零件的汽车旅行use.The零件永久增加油箱的大小(以里程计算)但是零件一旦使用就不能使用再次。汽车本身本来就有一个可以行驶一定英里数的油箱。找出在两个加油站之间穿越所需的初始最小油箱尺寸以及找出使用特定油箱最初可以穿越哪些加油站的最佳方法是什么?
我最初尝试过 Dijkstra,但它不适用于负值,而且我认为最小生成树不是最好的,因为它不一定会最小化两个节点之间的距离。我最初的想法是找到一种算法,该算法可以 return 两个值的总最小边权重(包括负数)但不确定如何做到这一点
基本算法可以按如下方式工作。
Keep a collection of unreached stations, with the distance from the
currently reachable stations set initially to infinity, except for the
initial station, for which the distance is empty.
Pick the station with the lowest distance. If it's above the capacity
of the fuel tank, then you're stuck.
If the station is the target station, then you've succeeded.
Otherwise, update the distances of any unvisited stations immediately adjacent
to the chosen station with the distances from this new station (if doing so reduces their distance). Update
the capacity of the fuel tank with the part in the current station.
Repeat from step 2, "Pick the station..."
这为您提供了一种方法,可以在给定初始油箱大小的情况下查找特定车站是否可达。
很容易修改此算法以找到到达目标站所需的最小初始油箱尺寸。从大小为 0 的油箱开始,每次卡住时(在步骤 2 中),增加初始油箱的大小,刚好不会卡住。
对于未到达的站点集,您可以使用 Dijkstra 算法中的斐波那契堆来获得 O(m + n log n) 运行时间(m = 道路总数,n = 加油站总数)。
关键的观察是,如果你能到达任何 n 个不同的加油站,那么你就可以去其中的 all 个,收集他们所有的油箱增强功能,并随心所欲地在所有可到达的车站之间行驶。
因为只有你可以连接到哪些站才重要,所以你不必记住到达那里所需路径的任何信息,你可以使用 MST 算法的一个简单变体来解决这个问题。
例如,当我们执行 Prim 算法时,我们可以跟踪所有可到达的油箱扩充件的总大小。
从起始站开始执行Prim的算法,直到到达目的地。每当你添加一个新的站点时,从边缘距离中减去当前的总增加大小,以计算出到达那里需要多少初始坦克。然后将空间站的增强添加到您的总数中。
您的答案是您到达目的地之前发现的最大初始油箱需求量。
一次有加油站无限汽油和零件的汽车旅行use.The零件永久增加油箱的大小(以里程计算)但是零件一旦使用就不能使用再次。汽车本身本来就有一个可以行驶一定英里数的油箱。找出在两个加油站之间穿越所需的初始最小油箱尺寸以及找出使用特定油箱最初可以穿越哪些加油站的最佳方法是什么?
我最初尝试过 Dijkstra,但它不适用于负值,而且我认为最小生成树不是最好的,因为它不一定会最小化两个节点之间的距离。我最初的想法是找到一种算法,该算法可以 return 两个值的总最小边权重(包括负数)但不确定如何做到这一点
基本算法可以按如下方式工作。
Keep a collection of unreached stations, with the distance from the currently reachable stations set initially to infinity, except for the initial station, for which the distance is empty.
Pick the station with the lowest distance. If it's above the capacity of the fuel tank, then you're stuck.
If the station is the target station, then you've succeeded.
Otherwise, update the distances of any unvisited stations immediately adjacent to the chosen station with the distances from this new station (if doing so reduces their distance). Update the capacity of the fuel tank with the part in the current station.
Repeat from step 2, "Pick the station..."
这为您提供了一种方法,可以在给定初始油箱大小的情况下查找特定车站是否可达。
很容易修改此算法以找到到达目标站所需的最小初始油箱尺寸。从大小为 0 的油箱开始,每次卡住时(在步骤 2 中),增加初始油箱的大小,刚好不会卡住。
对于未到达的站点集,您可以使用 Dijkstra 算法中的斐波那契堆来获得 O(m + n log n) 运行时间(m = 道路总数,n = 加油站总数)。
关键的观察是,如果你能到达任何 n 个不同的加油站,那么你就可以去其中的 all 个,收集他们所有的油箱增强功能,并随心所欲地在所有可到达的车站之间行驶。
因为只有你可以连接到哪些站才重要,所以你不必记住到达那里所需路径的任何信息,你可以使用 MST 算法的一个简单变体来解决这个问题。
例如,当我们执行 Prim 算法时,我们可以跟踪所有可到达的油箱扩充件的总大小。
从起始站开始执行Prim的算法,直到到达目的地。每当你添加一个新的站点时,从边缘距离中减去当前的总增加大小,以计算出到达那里需要多少初始坦克。然后将空间站的增强添加到您的总数中。
您的答案是您到达目的地之前发现的最大初始油箱需求量。