1. 程式人生 > >2018 BJTU Summer Training 【二分圖匹配 & 網路流 & 費用流】

2018 BJTU Summer Training 【二分圖匹配 & 網路流 & 費用流】

前言(瞎BB)

網路流是我在OI生涯學的最後一個演算法,它很適合演算法競賽,因為它需要建立模型(圖)來反映題目中的限制條件,而且可以得出一些最優的東西(最大流),或者是搞出方案(搜尋殘量網路),這些都是演算法競賽最喜歡的。

高中就聽說過一位神犇,憑藉一手網路流解決了許多標解不是網路流的題目,當時相信,但也就是聽個說法。這個暑假做了題單上的幾道題後才深刻感受到網路流的強大。

感覺目前自己的網路流板子還不夠完善,日後再補充,所有題目的程式碼直接上Vjudge搜,放在文章裡太臃腫,也懶得貼了= =

題意:一個n*m(n,m<=500)的矩陣中存在一些點,一次操作可以去除同一列或者同一行上所有的點,求最小的操作次數

題解:一個二分圖匹配的入門題。使用到了一個二分圖匹配的性質:二分圖的最小頂點覆蓋數 = 最大匹配數。一個二分圖的最大匹配的總能使得每一條邊的某一個點被覆蓋,且被覆蓋邊的總數最小。

回到這道題目,如果(x,y)處存在一個點,那麼將二分圖左邊x點和右邊y點之間連一條邊,最後跑二分圖匹配即可。這樣可以保證每條邊都匹配上一個點,對應原題目中每個點被一種方案消除。

題意:有n頭奶牛,每個奶牛都有自己喜歡的一些飼料和飲料,如果一頭奶牛能同時擁有自己喜歡的飼料和飲料,那麼它將得到滿足。每種飼料和飲料僅能供給一頭奶牛,問最多能滿足多少奶牛。

題解:友好的入門網路流題目,設超級源點向每個飼料連邊,每種飲料向超級匯點連邊,奶牛喜歡什麼就給奶牛連上邊,跑最大流即可。

題意:給出一個X*Y(3 <= Y, X <= 12)的字元矩陣來表示一個房間,'X'為障礙物,'.'表示一個空地且該空地上站有一個人,'D'表示一扇門。每個人一個時間單位移動一格,每扇門一個時間單位內僅能通過一個人,每個空位上的人數不作限制。保證最外圍只有障礙物或門,保證門只存在最外圍。求所有人離開的最小時間。

題解:說實話,這題如果不掛在題單上,我很難想到用網路流或者說是二分圖來解。每扇門的每個時間點都建一個點,然後對每個人連邊。如果一個人到一扇門的距離為x,則把這個人往這扇門x時間點以後的每個點都連上一條邊。

正解是二分答案,對應建圖,看最大匹配是否是總人數。我採用了從小到大列舉的方法,結果超時,加了Dinic演算法中的當前弧優化才勉強通過。

題意:一個CPU有A,B兩個核,現在有n個任務要處理。第i個任務在A核上解決花費為ai,在B核上解決花費為Bi。還有m個約束條件,在第i個任務中,若任務li和任務ri在不同的核上解決,則產生額外花費wi。求解決所有任務的最小花費。

題解:這種帶約束的任務分配問題很符合網路流的模型,但是這個資料範圍著實有問題,1e5很難讓我想到用網路流解決。

再說下解法。每個任務拆點為xi和yi兩點,xi連yi無限流量,超級源點連一條流量為ai的邊到xi,yi連一條流量為bi的邊到超級匯點。這樣跑最大流就是一個最小割,即最小花費。對於每個約束條件,則從li連一條流量為wi的邊到ri。類似上述用最小割的性質來求最小花費的方法在網路流24題中常有,要靈活應用。

題意:給出一張無向圖,要求從1走到n再走回1,每條路只能走一次,求最短路。

題解:用費用流來做,每條邊流量為1,費用為邊的長度,最後跑出最大流為2的最小費用即可。設定一個超級源點可以控制流量。

P2770 航空路線問題,這題是跑最長路,而且要輸出方案,稍微難一點。