在图表中从一个城市到另一个城市的最低旅行费用 不是dijkstra的算法

问题描述

鲍勃住在奥兰德(Oiland),那里有N个城市,编号从1到N,M条道路将这些城市连接起来。他想访问他居住的城市A的B城市,与Alice见面。这是一个漫长的旅程,鲍勃将在多个加油站停下来为汽车加油。 在不同的加油站,燃油价格不同,鲍勃准备绕道而行,以较低的价格参观加油站。鲍勃的地图上标有N个城市和S个加油站。从地图上,他知道在两个城市之间旅行需要多少升燃料,每个加油站每升的价格。汽车的燃油箱也具有最大容量C升。编写程序以查找从A市到B市旅行的最低消费额。他从空的油箱开始,到A市有一个加油站。

Constraints:
2 <= N cities <= 1000
1 <= M connecting roads <= 10000
1 <= S fuel stations <= 120
1 <= C fuel tank capacity <= 100000
1 <= G fuel needed to travel between any 2 cities <= 100000

我无法解决。如果有人可以给出其解决方案或提供一些解决方案的提示,那将是有帮助的。

解决方法

在每个泵上,驾驶员不仅需要决定下一步去哪里,还需要决定要购买多少燃料。

以下是未经验证的想法,可能会奏效,也可能不会奏效。

迪杰斯特拉(Dijkstra's)说,可以通过修改后的最小权重路径算法解决此问题。我们需要修改权重的概念。在我们的例子中,它不是一个单一的数字,而是一个函数,具体来说,该函数将油箱中剩余的燃油量映射到所花费的金额。举一个具体的例子,考虑从原点A到最近的泵X的一条边。假设距离为100 km,油耗为10l / 100km,A点处的燃料价格为$ 2 / l,则油箱可以50升驾驶员可以从10到50l的任何地方购买到从A到X的任何东西,因此AX边的权重是在区间0..40上定义的分段线性函数,取值为0时为$ 20,值为40时为$ 100。 >

现在,如果驱动程序从X继续到Y,则常规算法会将到目前为止的权重添加到边缘的权重上。但是我们有两个权重函数,一个是分段线性单调递增(到目前为止的权重),另一个是单分段分段线性(输出边缘的权重)。我们需要通过以下方式将两者结合起来。将第一个函数向左移动从X到Y所需的燃料量,丢弃负数部分,加上相应的价格。对于功能图的其余部分,请考虑与每个段相对应的燃料价格。如果本地燃料价格更高,则按原样保留该细分市场;如果本地便宜,则重新计算细分;如果该细分受众群代表一个空罐,请按当地价格加价。

查看此操作的另一种可能更简单的方法是,想象一个看起来像这样的列表:“在这一点上,我可能以每升p1的价格拥有多达x1升的燃料,也有多达x2升的燃料价格为p2,然后...”“当您到达加油站时,将清单中所有比当地价格贵的物品都丢掉,然后加满钱。

现在,当普通算法考虑通向同一顶点的两条路径时,需要确定哪个权重更好。由于权重现在是一个函数,因此修改后的算法需要采用两个函数中的最小值,这将是另一个函数,也是分段线性的。

因此,在图的每个顶点处都有单调递增的分段线性函数;函数图的每个点对应于在给定燃料量的情况下到达该顶点的最便宜方法。

您的最终解决方案是目标顶点中函数的值为0。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...