繁体   English   中英

在动态图中找到最短路径

[英]Find shortest path in dynamic graph

让我们看一下示例输入:

10.01.2013 CREATE road between 1 and 2 with maximum speed 90 and distance 120 25.03.2013 CREATE road between 1 and 4 with maximum speed 110 and distance 25 13.07.2013 CREATE road between 2 and 3 with maximum speed 160 and distance 320 19.07.2013 MODIFY road between 1 and 4 with maximum speed 120 01.11.2013 CREATE road between 1 and 3 with maximum speed 30 and distance 34 21.11.2013 MODIFY road between 2 and 3 with maximum speed 130 30.12.2013 CREATE road between 2 and 4 with maximum speed 80 and distance 120

当我们修改图时,只能提高速度。

好的,我需要回答问题。 例如:
When time travel between 1 and 4 will be shorter than 20 minutes When time travel between 2 and 4 will be shorter than 70 minutes

最多查询数量为10。

这是示例,随机数据仅用于解释我的问题。

我使用dijkstra算法回答了这个问题,但是我正在对图的每次修改中的每个查询运行Dijkstra。 因此,如果我有10 000修改和10查询,我的解决方案将运行100 000次Dijkstra算法。 我知道那很糟糕,但是这次我无法获得更好的解决方案,因此我在这里写信寻求帮助。 我可以补充一点,最大顶点数为10 000,最大边数为100 000。

由于图形修改只能改善从A点到B点的旅行时间,因此以下观察是正确的:

对于修改m 1m 2以使m 1早于m 2以及在相同点A和B, T 1T 2之间的传播时间,确实T 1 > = T 2

该观察结果使我们能够使用分而治之的策略 (本质上是二进制搜索)来回答查询:选择一个中点,使用Dijkstra的算法找到行进时间,然后根据结果在中点的右边或左边移动。

现在,您需要解决一个问题,即在直到特定修改点的图形中查找路径。 您可以通过添加{time, speed}对列表来扩展每个边缘,并通过在连接到该边缘的排序映射中查找来获得速度。

这使您获得Dijkstra算法的O(q * log 2 m)次运行,其中m是修改的数量,q是查询的数量。

您快要准备好了,您只需要进行一些优化即可。 我认为这里的要点是路径只会变短。 因此,对于查询来说,答案是第一次满足。 所以这是我建议的修改。

  1. 您像以前一样在初始图上运行Dijkstra。
  2. 按时间顺序对更新进行排序。
  3. 检查条件是否满足,如果满足则停止。
  4. 选择下一个更新,看看是否可以使用它来使用新路径改善到两个节点的最小距离。
  5. 如果没有改善,请执行4
  6. 如果有改进,请将更新的节点推入Dijkstra优先级队列,然后继续运行dijkstra,直到再次清空队列。
  7. 转到3并继续。

想象一下,图形的节点不仅是数字,而且带有日期和链接的数字也具有日期。 然后通过此修改后的图进行搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM