[英]Shortest path in Directed Acyclic Graph with small degree
給定n
個頂點上的加權有向非循環圖,使得每個頂點具有至多5
indecree和最多5
outdegree。 節點0, 1, ..., n - 1
的定向如下
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
...
n-5 n-4 n-3 n-2 n-1
邊緣只能從一行中的節點到下一行中的某個節點。
我們將給出q
查詢,詢問從u
到v
的最短路徑長度。 這里n
可以高達10^5
, q
高達10^4
。 權重都是正整數。
我們能否做得比O(nq)
動態編程更好(這顯然不適用於此)?
這似乎太好了,不好意思,如果它不是......你可以得到O(n)
( 編輯 : O(n^(4/3))
)預處理和O(1)查詢。
我在考慮你知道如何在時間O(n^2)
中計算圖中所有節點之間的所有最短距離。 (這確實可能,你似乎知道)
將圖形划分為k
個塊,每個塊包含n/(5*k)
行。 (塊應該在完整的行上開始和結束,並且兩個連續的行在它們各自的第一行和最后一行上重疊)
計算每個塊中所有節點(特別是第一行和最后一行)之間的最短路徑: O((n/k)^2)
。
然后,您可以考慮僅包含兩個塊之間邊界處的節點的簡化圖,其邊值等於它們剛剛計算出的最短路徑。此簡化圖的大小為O(k)
。 在時間O(k^2)
計算該圖中的所有最短路徑。
總預處理時間: O((n/k)^2 + k^2)
。 取k=sqrt(n)
,得到O(n)
預處理。
然后查詢時間為O(1)
:取u塊結束時的5個節點,v塊開始處的5個節點(如果塊不同),你只需要比較u-> v的25種可能性
編輯
當然這是假的。 實際上你有k塊用於計算最短路徑,因此該步驟的總復雜度為O(k*(n/k)^2)
。 因此總和為O(n^2/k + k^2)
, O(n^2/k + k^2)
的最佳選擇是k=n^(2/3)
,這給出了O(n^(4/3))
預處理的總復雜度O(n^(4/3))
和總查詢O(q)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.