1. 程式人生 > >網路流建圖的幾點體會(給自己看的筆記,持續更新)

網路流建圖的幾點體會(給自己看的筆記,持續更新)

求大牛分享網路流題集與學習經驗,dp大牛要拍磚請去隔壁動態規劃筆記篇~~

網路流建圖,實質是對實際問題的抽象。用一些圖論中的理論去模擬實際問題,然後再把解出的答案轉化為實際問題的答案。

限制通常體現在邊權上,實際意義什麼的可能體現在點上也可能體現在邊上。

網路流適用問題一:多次方案的疊加問題,不同方案的選擇互相排斥,適當建圖把各方案表示在一個圖裡是關鍵。比如:

1.從某點到某點走最短路,有多少種走法(走過的邊不能再走)。起點為源,終點為匯,所有可以成為最短路徑一部分的邊,其權置為一(因為只能被選一次,不同方案的選擇互相排斥)。然後跑最大流即可。

2.給定二分圖,求可構成完備匹配的不同方案數(選過的邊不能再選)。見hdu3081,hdu3277。。自建源點和匯點,將二分圖左右兩部分,左邊各點與源點相連,右邊各點與匯點相連。接下來要通過限定邊權來轉化問題。從源點到左邊各點的邊權皆設為limit,從右邊到匯點的各邊權也設為limit。跑最大流,若最大流結果為n*limit,就說明至少可以構成limit種方案。

3.接上。技巧:若某點有多種型別的選擇,那麼可以通過拆點實現建模。如上hdu3277。每個女孩可以在K個不喜歡的男孩中進行選擇。也就是說在這多次方案疊加最後的結果中,每個女孩所選的不喜歡的男生不能超過K個,這裡考慮拆點,每個女孩拆成兩個點,一個連喜歡的男生,一個連不喜歡的男生。然後限制邊權,這兩個點所能夠獲得的總流為limit,然後跑最大流即可。

網路流使用問題二:在限制條件下求最優解,將實際問題合理地轉化為圖論裡的問題(邊,點之類的)是關鍵,思路要活躍一些

這類問題感覺比較需要腦洞Orz,比如:

1.hdu4292:有F種食物 D種飲料 它們都有一定的數量 有N個人 每個人都有自己喜歡吃的食物和飲料 (每個人至少要一種食物和飲料) 只有能滿足他的要求時他才會接服務 求最大能滿足多少人。。這裡自建超級源點與匯點,源點與食物相連,匯點與飲料相連,邊權為其數量。每個人拆成兩個點,邊權為1,再分別與其喜愛的飲料與食物相連。跑最大流即可。這裡將某人必須同時具有至少一個喜愛的食物與飲料轉化為一條邊,即實際問題轉化為圖論的東西。同類型的問題還有POJ3281.。。。(待補充~~)

2.關於拆點,也可用於某些限制條件的設定。hdu2732,通過對柱子拆點,邊權設定為每個柱子能被跳多少次;hdu3338,將某行某列相交處某個數的大小表示為某行與某列的連邊,然後行與源點相連,列與匯點相連(類比一下二分匹配裡的行列匹配和奇偶匹配),跑最大流。

3.hdu3605.這其實更像個匹配問題。。n個人,m個星球。給出每個人能適應哪個星球以及每個星球能容納多少人。求最多轉移多少人。

源點與各人相連,權值皆為一,星球與匯點相連,權值為能容納的人數。跑最大流。將把人轉移到某星球上表示為人與星球的連邊。

另外由於網路流比較費時。建圖的時候,能優化最好優化。比如這題m比較小n比較大,那麼很多人的選擇事實上可以合併,最多1024組左右。。

4.hdu2883。一臺燒烤機一次最多烤m塊肉,n位顧客,第i位到達時間為si,離開時間為ei,點了ci塊肉,每塊烤時間為di,問能否滿足所有人的要求。。

由於每個時間段裡烤肉機都只能烤m塊肉,所以把時間分段,看成點。把烤肉花的時間作為各邊權。。用這樣的思路建圖。

5.hdu4289。給定一圖,恐怖分子要從S城到D城,問警察最少封鎖多少座城市就可以阻止恐怖分子。

以S為源點,D為匯點。每個城市拆點,邊權為一。這就使所有經過該城的路徑最多能流過的流為一,從而最大流的值就是最少要封鎖的城數。

網路流建圖的常見優化總結。

1.hdu3605.這其實更像個匹配問題。。n個人,m個星球。給出每個人能適應哪個星球以及每個星球能容納多少人。求最多轉移多少人。

源點與各人相連,權值皆為一,星球與匯點相連,權值為能容納的人數。跑最大流。將把人轉移到某星球上表示為人與星球的連邊。

另外由於網路流比較費時。建圖的時候,能優化最好優化。比如這題m比較小n比較大,那麼很多人的選擇事實上可以合併,最多1024組左右。。

2.hdu4280.。圖好建,但據說比較卡時間。個人感覺ISAP(加gap優化)比dinic更快一些,模板很重要啊。。

3.hdu1087.有一些用電器,一些插座,好多好多介面卡(和日常生活中的一樣的概念)。給定他們具體的資訊,問最多有多少用電器能充上電。自建源點匯點,源點與用電器型別相連,邊權為一,插座型別與匯點相連,邊權為一。比較頭疼的就是由於介面卡,不同型別也可以相互匹配,搞起來很麻煩。這時候我們可以直接在插座型別上連邊,比如某介面卡可以將A->B,那麼就在A與B之間連一條邊,邊權為INF。自己考慮一下就明白了。這裡就大大簡化了建圖操作。

幾個特別的題。

1.網路流與線性規劃24題之02:

太空飛行中,可以在飛船上做一些實驗,每個實驗都需要一些儀器。做實驗會得到相應的報酬,每種儀器又要付出相應的成本。求淨利潤最大為多少?(做試驗獲得的總報酬減去配備儀器所需的總花費)。

這裡實際上是求最大權閉合圖問題。將源點與各實驗相連,邊權為報酬;各儀器與匯點相連,邊權為花費。試驗與儀器具有對應關係的就連邊,邊權為無窮大。跑最大流。最終答案就是所有試驗的總報酬減去最大流的值。。具體的話這裡有篇部落格講得挺詳細http://www.cnblogs.com/wuyiqi/archive/2012/03/12/2391960.html

2.