簡體   English   中英

在線性時間內找到有向圖中邊的最大成本差異的路徑

[英]Find path with maximum cost difference of edges in directed graph in linear-time

有一個有向圖G ,其邊具有正權重,我們將路徑成本定義為具有最小權重和最大權重的邊之間的差異。 目標是在其他路徑中找到成本最高的路徑。 我們不需要只返回最大成本的路徑本身。

如果x是頂點數, y是邊數,則x < 10^5y < 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] = -InfinityminimumWeigh[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。

為了更好地理解,讓我們看一個例子。

假設我們有這樣一個初始圖。 假設我們有這樣一個初始圖。

壓縮后,圖形將如下所示。 壓縮后,圖形將如下所示。

經過拓撲排序后,我們得到了這個頂點順序。 (綠色數字) 經過拓撲排序后,我們得到了這個頂點順序。 (綠色數字)

依次計算所有 DP 值,並更新答案。 依次計算所有 DP 值,並更新答案。

最終答案 6 將在計算頂部頂點 DP 時得到。

我希望結果是非常詳細和清楚的。 最終時間復雜度為O(|V|+|E|)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM