在动态图表

时间:2015-12-04 13:16:07

标签: java algorithm graph dijkstra shortest-path

让我们看看我们的示例输入:

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。

3 个答案:

答案 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)

你几乎就在那里,你需要一些优化。 我认为这里的要点是路径只能缩短。因此,对于查询,答案是第一次令人满意。 所以这是我建议的修改。

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

答案 2 :(得分:0)

想象一下,图表中的节点不仅仅是数字,而且带有日期和链接的数字也有日期。然后搜索这个修改过的图。