让我们看看我们的示例输入:
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。
答案 0 :(得分:2)
由于图形修改只能改善从A点到B点的行程时间,因此以下观察是正确的:
修改 m 1 和 m 2 ,以便 m 1 早于 m 2 和相同的A点和B点之间的旅行时间, T 1 和 T 2 ,确实 T 1 > = T 2 子> 的
这个观察结果让我们使用divide and conquer strategy(实质上是二元搜索)来回答查询:选择一个中点,使用Dijkstra算法找到旅行时间,然后根据结果向中间左右移动。 / p>
现在,您需要解决在构建到某个修改点的图形中查找路径的问题。您可以通过使用{time, speed}
对列表扩充每个边缘来实现,并通过在附加到该边缘的有序地图中查找来获得速度。
这为你提供了Dijkstra算法的O(q * log 2 m)运行,其中m是修改次数,q是查询次数。
答案 1 :(得分:0)
你几乎就在那里,你需要一些优化。 我认为这里的要点是路径只能缩短。因此,对于查询,答案是第一次令人满意。 所以这是我建议的修改。
答案 2 :(得分:0)
想象一下,图表中的节点不仅仅是数字,而且带有日期和链接的数字也有日期。然后搜索这个修改过的图。