[英]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.