[英]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 1和m 2以使m 1早于m 2以及在相同点A和B, T 1和T 2之间的传播时间,确实T 1 > = T 2
该观察结果使我们能够使用分而治之的策略 (本质上是二进制搜索)来回答查询:选择一个中点,使用Dijkstra的算法找到行进时间,然后根据结果在中点的右边或左边移动。
现在,您需要解决一个问题,即在直到特定修改点的图形中查找路径。 您可以通过添加{time, speed}
对列表来扩展每个边缘,并通过在连接到该边缘的排序映射中查找来获得速度。
这使您获得Dijkstra算法的O(q * log 2 m)次运行,其中m是修改的数量,q是查询的数量。
您快要准备好了,您只需要进行一些优化即可。 我认为这里的要点是路径只会变短。 因此,对于查询来说,答案是第一次满足。 所以这是我建议的修改。
想象一下,图形的节点不仅是数字,而且带有日期和链接的数字也具有日期。 然后通过此修改后的图进行搜索。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.