![](/img/trans.png)
[英]Check if there exist a path between two vertices in directed acyclic graph - queries
[英]Maximum weighted path between two vertices in a directed acyclic Graph
喜歡這個問題的一些指導:
G是有向無環圖。 您想要從頂點c移動到頂點z。 一些邊緣會降低您的利潤,一些會增加您的利潤。 如何在最大化利潤的同時從c到z。 什么是時間復雜度?
謝謝!
該問題具有最佳子結構。 為了找到從頂點c
到頂點z
的最長路徑,我們首先需要找到從c
到z
所有前驅的最長路徑。 這些問題的另一個問題是另一個較小的子問題(從c
到特定前任的最長路徑)。
讓我們將z
的前身表示為u1,u2,...,uk
和dist[z]
為從c
到z
的最長路徑然后dist[z]=max(dist[ui]+w(ui,z))
..
下面是3個前輩省略邊集權重的說明:
因此,要找到z
的最長路徑,我們首先需要找到其前任的最長路徑並取最大值(它們的值加上它們的邊緣權重到z
)。
這要求每當我們訪問頂點u
,必須對所有u
的前輩進行分析和計算。
所以問題是:對於任何頂點u
,如何確保一旦我們設置dist[u]
, dist[u]
以后永遠不會改變? 換句話說:如何確保在考慮任何來自u
邊緣之前我們已經考慮了從c
到u
所有路徑?
由於圖是非循環的,我們可以通過在圖上找到拓撲排序來保證這種情況。 拓撲排序就像一個頂點鏈,所有邊都從左到右指向。 因此,如果我們在頂點vi
那么我們已經考慮了所有通向vi
路徑並且具有dist[vi]
的最終值。
時間復雜度:拓撲排序需要O(V+E)
。 在最糟糕的情況下, z
是一個葉子而所有其他頂點都指向它,我們將訪問所有圖形邊緣,給出O(V+E)
。
設f(u)是您在DAG中從c到u的最大利潤。 然后你想要計算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.