給定乙個有向無環加權圖,求圖中的最長路徑。
該圖中的最長距離為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 中。你的任務是選出盡可能多的矩...