簡體   English   中英

有向非循環圖中兩個頂點之間的最大加權路徑

[英]Maximum weighted path between two vertices in a directed acyclic Graph

喜歡這個問題的一些指導:

G是有向無環圖。 您想要從頂點c移動到頂點z。 一些邊緣會降低您的利潤,一些會增加您的利潤。 如何在最大化利潤的同時從c到z。 什么是時間復雜度?

謝謝!

該問題具有最佳子結構。 為了找到從頂點c到頂點z的最長路徑,我們首先需要找到從cz所有前驅的最長路徑。 這些問題的另一個問題是另一個較小的子問題(從c到特定前任的最長路徑)。

讓我們將z的前身表示為u1,u2,...,ukdist[z]為從cz的最長路徑然后dist[z]=max(dist[ui]+w(ui,z)) ..

下面是3個前輩省略邊集權重的說明:

在此輸入圖像描述

因此,要找到z的最長路徑,我們首先需要找到其前任的最長路徑並取最大值(它們的值加上它們的邊緣權重到z )。

這要求每當我們訪問頂點u ,必須對所有u的前輩進行分析和計算。

所以問題是:對於任何頂點u ,如何確保一旦我們設置dist[u]dist[u]以后永遠不會改變? 換句話說:如何確保在考慮任何來自u邊緣之前我們已經考慮了從cu所有路徑?

由於圖是非循環的,我們可以通過在圖上找到拓撲排序來保證這種情況。 拓撲排序就像一個頂點鏈,所有邊都從左到右指向。 因此,如果我們在頂點vi那么我們已經考慮了所有通向vi路徑並且具有dist[vi]的最終值。

時間復雜度:拓撲排序需要O(V+E) 在最糟糕的情況下, z是一個葉子而所有其他頂點都指向它,我們將訪問所有圖形邊緣,給出O(V+E)

f(u)是您在DAG中從cu的最大利潤。 然后你想要計算f(z) 這可以使用動態編程/拓撲排序在線性時間內輕松計算。

c以外的每個u初始化f(u)= -infinity,並且f(c)= 0 然后,繼續以DAG的某些拓撲順序計算f的值。 因此,由於順序是拓撲的,對於正在計算的節點的每個進入邊緣,計算其他端點,因此只需選擇該節點的最大可能值,即f(u)= max( f(v)+ cost( v,u) )每個進入邊緣(v,u)

自DAG以來,最好使用Topological Sorting而不是Bellman Ford

資料來源: - http://www.utdallas.edu/~sizheng/CS4349.d/l-notes.d/L17.pdf

編輯:-

G是具有負邊緣的DAG。

一些邊緣會降低您的利潤,一些會增加您的利潤

  • 邊緣 - 增加利潤 - 正值
  • 邊緣 - 減少利潤 - 負值

在TS之后,對於TS順序中的每個頂點U,放松每個輸出邊緣。

dist[] = {-INF, -INF, ….}
dist[c] = 0 // source

for every vertex u in topological order
  if (u == z) break; // dest vertex
  for every adjacent vertex v of u
    if (dist[v] < (dist[u] + weight(u, v))) // < for longest path = max profit
      dist[v] = dist[u] + weight(u, v)

ans = dist[z];

暫無
暫無

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

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