1. 程式人生 > 其它 >網路流 & 二分圖 & 線性規劃

網路流 & 二分圖 & 線性規劃

網路流

1. P4177 [CEOI2008]order

題意 :有 \(n\) 個工作, \(m\) 個機器, 每種機器可以租或者買, 給定 \(n\) 個工作的收益, 需要的機器和此次租這臺機器的費用, 求最大化利益。

\(\text{solution}:\)

顯然, 如果沒有租的要求的話, 那麼就是一個最大權閉合子圖模板。

最大權閉合子圖 :一個有向圖,點有點權,選一個點必須要選它的所有後繼, 求最大權值和。

具體建圖 :新建一個源點 S 和匯點 T,將 S 與所有點權為正的點連邊,流量為 \(a_i\), 並累加權值, 將 所有點權為負的點向 T 連邊, 流量 \(-a_i\)。對於原圖,建 \(x \to y\)

,流量 \(\infty\) 的邊, 將累加的權值減去最大流 / 最小割既是最大權值和。

對於點權為正且無殘餘流量的點來說, 它沒有被選,否則被選。

對於點權為負且無殘餘流量的點來說, 它被選, 否則沒被選。 可以根據此輸出方案。

好了, 這個題還有租的機器的方案,因為買對所有工作都有效, 租只對當前工作有效, 那麼就把流量為 \(\infty\) 的改成租的代價再跑一遍最大流即可。

用最小割理解可能更簡單一些。

P3749 [六省聯考 2017] 壽司餐廳

題意 : \(n\) 種壽司, 每種壽司有一個代號 \(a_i\) 和一個美味度 \(d_{i,i}\),你可以不限次數吃一段區間的壽司, 收益為 \(\sum\limits_{i=l}^{r}\sum\limits_{j=i}^{r}d_{i,j}\)

, 每種收益 \(d_{i,j}\) 只能算一次。

假設最後你吃了 \(c\) 種代號為 \(x\) 的壽司, 你要支付的代價為 \(mx^2+cx\)\(m\) 是給定的一個常數。

最大化收益 - 代價。

\(\text{solution}:\)

發現每種收益只能算一次這個現在比較奇怪, 而且要求的是收益 - 代價, 不難想到最大權閉合子圖。

考慮怎麼把這個圖建出來 :你要得到 \(d_{i,j}\) 的收益, 那麼一定得到了 \(d_{i,j - 1}\)\(d_{i+1,j}\) 的收益,因為你選擇的是一段段的區間,那麼就從 [i, j] 連向 [i,j - 1] 和 [i + 1, j],再對 \(d_{i,j}\)

的收益正負考慮它是從 S 連出來還是向 T 連過去。

把代價放在單點上考慮, 每吃一個代號為 \(a_x\) 的, 那麼就要付出 \(a_x\) 的代價, 因為代號的 \(mx^2\) 也只能算一次, 再把單點連向它的代號, 代號的代價即是 \(mx^2\),跑出最大流即可。

P1361 小M的作物

題意 : \(n\) 種作物, A,B 兩塊地,每種作物只能種在一塊地裡面, 會有不同的收益。

另外有 \(m\) 種組合方式, 表示把該種組合的所有作物都種在一塊地裡面會有額外收益。

求最大收益。

\(\text{solution}:\)

二選一模型, 可以考慮最小割。

先考慮沒有額外收益的情況 :源點表示選 A,匯點表示選 B,每個點與 S, T 分別連邊, 流量為分別的權值, 最後用總和 - 最大流即可。

再考慮加入點集的答案, 這個點集無非只有三種情況 :

1.全種在 A 中,有 \(c_{1, i}\) 的貢獻。 2. 全種在 B 中, 有 \(c_{2, i}\) 的貢獻。 3. 只有部分在 A,無貢獻。

我們考慮建出一個虛點來表示這個集合,分別與 S, T 相連邊, 再與集合中所有的點連邊, 邊權為 \(\infty\) , 表示這些邊不能被刪。

那麼跑完最小割後, 如果邊權為 \(c_1\) 的邊沒有割去,那麼這些點一定都屬於集合 A。 如果邊權為 \(c_2\) 的邊沒有割去, 那麼這些點一定都屬於集合 B,那些邊權為 \(\infty\) 的邊一定不會被刪。

感性理解即可,對於這種模型一定要多積累和多練。

P2764 最小路徑覆蓋問題

P6061 [加油武漢]疫情調查

P5038 [SCOI2012]奇怪的遊戲

P2053 [SCOI2007]修車

P2050 [NOI2012] 美食節

CF976F Minimal k-covering

P3980 [NOI2008] 志願者招募