動態規劃 求DAG中最長路徑

2021-10-04 19:30:45 字數 1406 閱讀 8866

給定乙個有向無環加權圖,求圖中的最長路徑。

該圖中的最長距離為14,即2->4->6->2。

首先我們要對有向無環加權圖進行拓撲排序。拓撲排序的意思簡要來說就是將圖中頂點和邊排成乙個線性序列,對於,經拓撲排序後一定滿足vi在vj的前面。

拓撲排序的實現方法:

首先找出圖中入度為0的點加入拓撲排序後的序列,例子中為s,接著將中頂點v的入度減一,例子中將點c和a的入度減一,此時頂點c的入度為0,將頂點c放入拓撲排序的序列,將從c出發與c相鄰的點的入度減一。重複迴圈此過程,直到所有點都在拓撲排序後的序列中。

比如,例子中給出的dag經拓撲排序後為:

我們考慮簡單情況,即給定的圖中入度為0的點只有乙個,比如上圖只有s點的入度為0。

根據拓撲排序後的圖很容易得到遞推關係式,用path(i)表示從入度為0的點到頂點 i 的最長路徑,初始條件為path(s)=0。這裡依據上圖,給出兩個具體的式子。

(1)path(e)=max

(2)path(b)=path(a)+6

根據遞推關係式以及拓撲排序後的順序,依次求出從入度為0的點到各個點的最長路徑,最後返回乙個最大值即可。

vector<

int>

sort

(vector<

int>

& in,vector

int>>

& edge)}}

}return sort;

}int

longestpath

(vector

int>>

& edge)

indegree[i]

=in;

}

sort=

sort

(indegree,edge)

;

path[0]

=0; path[sort[1]

]=0;

for(

int i=

2;isize()

;i++

) path[sort[i]

]=max_path;

}//找最大值

int max=path[1]

;for

(int i=

2;isize()

;i++)if

(max

) max=path[i]

;return max

}

動態規劃四(DAG最長路)

在圖的有關知識中已經了解了dag就是有向無環圖,其中計算最長路 關鍵路徑 的做法非常複雜,這裡介紹更簡單的方法。求整個dag的最長路徑 即不固定起點和終點 固定終點,求dag的最長路徑。給定乙個有向無環圖,怎樣求解整個圖的所有路徑中權值之和最大的那條。令dp i 表示從i號頂點出發能獲得的最長路徑長...

動態規劃 DAG模型

有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a c,b d或者b c,a d 相當於旋轉x90度 例 1,5 可以巢狀在 6,2 內,但不能巢狀在 3,4 中。你的任務是選出盡可能多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀在下...

動態規劃 DAG模型

dag 有向無環圖 上的動態規劃是學習動態規劃的基礎。有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a c,b d或者b c,a d 相當於旋轉x90度 例 1,5 可以巢狀在 6,2 內,但不能巢狀在 3,4 中。你的任務是選出盡可能多的矩...