20240703總結(費用流)

星河倒注發表於2024-07-03

A - Going Home

HDU1533 Going Home
題解:費用流板子題,沒什麼好說的

B - Boxes

SOPJ Boxes
題解:又一道費用流板子題,但是我以為它是個序列然而它是個環

C - The Most Reckless Defense

The Most Reckless Defense CF1955H
題解:省流,寫了篇題解:
為什麼所有題解都是狀壓 DP ,這題不是看著很網路流(最小費用最大流)嗎?

首先還是分析一下 \(r\) 的取值範圍,可以把敵人增加的血量理解為減少防禦塔的傷害,那麼一座防禦塔的總傷害最多是 \(500\pi r^2 - 3^r\),不難發現 \(r\) 最大為 \(12\),這就很符合網路流的範圍。

接下來建圖,把防禦塔當作左部點,半徑為右部點。有幾種型別的邊:

\(1\) 類:源點向左部點連邊,流量為 \(1\),費用為 \(0\)

\(2\) 類:右部點向匯點連邊,流量為 \(1\),費用為 \(0\)

\(3\) 類:每一個左部點向每一個右部點連邊,流量為 \(1\),費用為這座防禦塔在這個半徑下的總傷害(減去了敵人增加的血量)的相反數。

對第 \(3\) 類邊做一下解釋:

費用流求的是最小費用,但是我們要求的是最大的傷害,所以取一個相反數,輸出的時候反過來就行了。當然如果本來就是個負數肯定不連。

D - Heidi and Library (hard)

CF802C Heidi and Library (hard)
題解:考慮我們買了所有的書然後刪掉一些的過程。

拆點,每個點有買和賣兩個點。先從源點連向所有的買點,流量為1,費用為這本書價值。

然後每個買點向賣點連邊,流量為1,費用為0,賣點向匯點連邊,流量為1,費用為0

每一個買點向下一個買點連邊,流量為k-1,費用為0,因為下一本書還要佔一個位置

最後如果一本書之前有和它同型別的書,它的上一個買點連向上一本與它同型別的書,流量為1,費用為這種型別的書的價格的相反數(相當於上一種刪掉一個同型別的書)

E - Machine Programming

CF164C Machine Programming
題解:對於每個任務,我們新建兩個時間節點s[i]和t[i]代表起始時刻與終止時刻,並連一條容量為1,費用為c[i]的單向邊。這類邊限制了每個任務最多隻能交給一臺機器做,並且做了可以得到c[i]的利潤。慮到值域很大,要離散化。

除此之外,還要按照時間順序,將所有相鄰的時間節點連線起來。將這些邊的容量都設定為k,費用為0。也就是說每時每刻機器數量不能超過k,且閒置機器可以留到後面用,但不會得到利潤。

現在我們把源點連向初始時間,最終時間連向匯點,跑最大費用最大流就可以了。輸出方案時,只需要檢查任務i對應的邊有沒有流量流經,有的話說明該任務被選擇了。

G - 工作安排

P2488 [SDOI2011] 工作安排
題解:基本上就是版題,源點向每個員工多連幾條邊,設定一下流量即可

H - 軟體開發

P2223 [HNOI2001] 軟體開發
題解:先拆點,把每一天拆成早上和晚上(可以理解為早上是乾淨的毛巾,晚上是髒毛巾)。

源點和每天早上連邊,流量為INF,費用為f,代表買新毛巾

源點和每天晚上連邊,流量為當天所需的毛巾,意為一天結束獲得這麼多髒毛巾

早上和匯點連邊,流量為當天所需的毛巾,費用為0,代表供應這麼多新毛巾

第i天的晚上和第i+a+1天的早上連邊,流量為INF,費用為fa(洗a天要a+1天后才能用)

第i天的晚上和第i+b+1天的早上連邊,流量為INF,費用為fb(洗b天要b+1天后才能用)

I - 數字配對

P4068 [SDOI2016] 數字配對
題解:題目要求獲得總價值不小於0的情況下匹配數最多,於是我們直接二分匹配數(流量)

考慮ai是aj倍數且ai除aj結果為質數的連邊條件。可以把他們質因數分解,那麼如果ai是aj的倍數且ai的質因子個數(重複的也算)比aj的大1,就可以匹配,所以根據質因子個數奇偶分成左部點和右部點,然後建一個超級匯點方便我們二分。剩下的建邊就很簡單了。

相關文章