![](/img/trans.png)
[英]How to find the number of different shortest paths between two vertices, in directed graph and with linear-time?
[英]Find path with maximum cost difference of edges in directed graph in linear-time
有一個有向圖G
,其邊具有正權重,我們將路徑成本定義為具有最小權重和最大權重的邊之間的差異。 目標是在其他路徑中找到成本最高的路徑。 我們不需要只返回最大成本的路徑本身。
如果x
是頂點數, y
是邊數,則x < 10^5
和y < min(x^2,10^5)
。 時間限制為 1 秒。
基於邊界,我認為這個問題必須在O(x+y)
時間內解決。
因此,基於問題屬性和對其他算法的一些研究,我認為可能的答案可能包含多個DFS
(如 SCC 問題)。 我也發現了 Dijkstra 算法的類似問題,可以針對此問題進行修改,但我不太確定復雜度是否合適。 還有一些其他問題與我的類似,但答案是O(m^2)
或更高,效率不高。
除了上面提到的以外,我不知道如何解決這個問題,一些見解會很有幫助。 謝謝
解決方案:由於我們的圖表可能有循環,這使我們的事情變得復雜。 讓我們構建一個新圖,在其中我們將強連接的所有組件“壓縮”到單個頂點中,因此新圖將是非循環的。 在此過程中,讓我們記住每個強連接組件的邊的最大( maximumWeight[v]
)和最小( minimumWeigh[v]
)權重。 我們為此花費了O(|V| + |E|)
時間,其中|V|
是頂點數, |E|
如果邊是計數。
之后讓我們以O(|V|+|E|)
的時間復雜度對給定的圖進行拓撲排序。 然后我們來計算簡單的DP。
dpMax[v]
- 從該頂點到有路徑的邊的最大權重。 dpMin[v]
- 有從該頂點到的路徑的邊的最小權重。
默認值:如果頂點v
是強連通分量,則最大和最小權重已經計算在maximumWeight[v]
和minimumWeigh[v]
中,因此dpMax[v] = maximumWeight[v]
和dpMin[v] = minimumWeight[v]
。 否則maximumWeight[v] = -Infinity
和minimumWeigh[v] = Infinity
。
按照拓撲順序,讓我們改進每個頂點的 DP:
int answer = -Infinity;
for(auto v : vertexesInTopologicalOrder) {
int newMinDp = dpMin[v], newMaxDp = dpMax[v];
for(auto e : v.outgoingEdges) {
int l = dpMin[v];
int r = dpMax[v];
l = min(l, e.weight);
r = max(r, e.weight);
l = min(l, dpMin[e.target]);
r = max(r, dpMax[e.target]);
answer = max(answer, e.weight - l);
answer = max(answer, r - e.weight);
newMinDp = min(newMinDp, l);
newMaxDp = max(newMaxDp, r);
}
dpMin[v] = newMinDp;
dpMax[v] = newMaxDp;
}
由於我們按拓撲順序計算 DP,因此已經計算了可實現頂點的 DP。
為了更好地理解,讓我們看一個例子。
最終答案 6 將在計算頂部頂點 DP 時得到。
我希望結果是非常詳細和清楚的。 最終時間復雜度為O(|V|+|E|)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.