簡體   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