AtCoder 🟡 AT_dp_g Longest Path
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 🟡 AT_dp_g Longest Path
Problem Statement
題目簡述
給定一個 個頂點、 條邊的有向無環圖 (DAG),求圖中最長有向路徑的長度(即路徑所包含的邊數)。
Constraints
約束條件
- 圖不含有向環
思路:拓撲排序 + DP
本題是經典的 DAG 最長路徑問題。由於圖中不含有向環,我們可以利用拓撲排序 (Topological Sort) 的順序來進行動態規劃,確保在計算某個節點的狀態時,其所有前驅節點的狀態都已經計算完畢。
狀態定義
定義 為以節點 為終點的最長路徑長度。
替代定義與記憶化搜索
也可以定義 為以節點 為起點的最長路徑長度,這等價於在反圖上定義 為終點。
對於拓樸序DP的問題,也可以使用 記憶化搜索 (DFS + Memoization) 來實現,然而需要注意遞迴時與迭代的順序是相反的。
轉移方程
對於圖中的每一條有向邊 :
- 初始化:所有節點的 初始值為 。
- 計算順序:依照拓撲序(入度為 0 的節點優先)進行更新。
- 最終答案:。
為什麼需要拓撲排序?
在 BFS 過程中,僅當節點 的入度減為 0 時(意味著 的所有前驅 都已處理並更新過 值),我們才將 加入佇列。這保證了 DP 的無後效性。
複雜度分析
- 時間複雜度:
完整的拓撲排序過程中,每個頂點進出佇列一次,每條邊被遍歷一次。 - 空間複雜度:
主要空間消耗在於鄰接表 (g)、入度陣列 (deg) 以及 DP 陣列 (f)。
Code
1 | def solve(): |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus
















