問題描述
給定 N 個加權開區間 (a_i, b_i),權重 w_i。選擇若干區間使得總權重最大,約束:實數軸上任意點被覆蓋次數不超過 K。N ≤ 200,坐標 ≤ 100,000。
核心建模:最小費用最大流
將問題轉化為網絡流模型:
- 離散化座標:收集所有端點
a_i, b_i,排序去重,映射為 1..M
- 構建鏈狀圖:相鄰離散點
i → i+1 連邊,容量 K,費用 0(保證任意點覆蓋 ≤ K)
- 區間邊:每個區間
[a_i, b_i] 連邊 a_i → b_i,容量 1,費用 -w_i(選擇區間獲得收益)
- 源匯點:超級源
S → 1,超級匯 M → T,容量 K,費用 0
為什麼這樣建模是正確的?
- 鏈狀邊
i→i+1 容量 K 限制了通過該段「流量」≤ K,對應覆蓋次數限制
- 區間邊
a→b 繞過中間鏈狀邊,攜帶負費用(收益),流經它代表選擇該區間
- 最小費用流會自動選擇「性價比最高」的區間組合
SPFA + Dinic 最小費用流模板
#include
#include
#include
#include
關鍵技巧總結
- 座標離散化:將 100,000 範圍壓縮至 ≤ 400 個點
- 鏈狀圖構造:連續點連容量 K 費用 0 的邊,優雅解決覆蓋限制
- 負費用表示收益:最小費用流自動最大化總權重
- SPFA 求最短增廣路:處理負權邊,適用於費用流
複雜度分析
- 離散化:O(N log N)
- 最小費用流:O(flow * E * V) 在此數據範圍極快(N≤200,流量≤K≤200)