網絡流練習筆記

一些經常使用的套路:網絡

  • 必須完成的一些目標,能夠考慮搞進流量中,由於跑最大流的話確定會流滿,也就至關於強制地完成了那些目標。
  • 拆點。而後能夠經過兩點之間連某個容量的邊來限制該點取到的次數。
  • 創建超級源點、匯點。幾乎在每道題中都會用到,不光方便計算,還能夠經過連邊的方式對某些狀態進行操做。

P1251 餐巾計劃問題

發現天天開始和結束時的狀態是不同的,考慮拆點。spa

接着怎麼辦?模擬餐巾的路線嗎?設計

假如從白天向晚上連一條邊表示餐巾由乾淨變爲髒的話,會發現根本沒法處理天天的需求量。遞歸

那反正只要是乾淨的就好了,咋來的咱無論,那就直接從超級源點流過來嘛。而後就可讓餐巾流到超級匯點來完成需求啦!get

具體分如下幾種:it

  • 由超級源點向天天晚上連一條容量爲當日需求,費用爲 \(0\) 的邊。表示晚上得到髒餐巾。
  • 由天天早上向超級匯點連一條容量爲當日需求,費用爲 \(0\) 的邊。表示白天須要新餐巾。
  • 由天天晚上向第二天晚上連一條容量爲 \(\infty\),費用爲 \(0\) 的邊。表示餐巾不洗留到下一天。
  • 由天天晚上向如今送去快洗能洗好的那天早上連一條容量爲 \(\infty\),費用爲快洗費用的邊。表示送去快洗。
  • 由天天晚上向如今送去慢洗能洗好的那天早上連一條容量爲 \(\infty\),費用爲慢洗費用的邊。表示送去慢洗。
  • 由超級源點向天天早上連一條容量爲 \(\infty\),費用爲購買新餐巾費用的邊。表示購買新餐巾。

而後跑最小費用最大流。io

值得注意的是,第三點處於貪心的考慮,確定會直接洗掉。但咱們發現設計的方案中並無設置這樣一個庫存餐巾,因此就得經過這一步來使得餐巾可以在必須洗的那天晚上恰好洗掉,從而達到和提早洗完同樣的效果。因此若是某天晚上就算送去快洗也洗不完了,前一天晚上的這條邊能夠不連。class

P4015 運輸問題

亂翻網絡流二十四題時有幸看到這個帖子秒殺

故在此說明一點:最長路徑問題是 NP-HARD 的緣由是可能存在正權圈,這種狀況下要求最長簡單路徑。相似地,存在負權圈的最短簡單路徑也是 NP-HARD 的。詳情能夠看這個回答di

每一個倉庫向每一個零售商店連容量爲 \(\infty\),給定費用的邊。再從超級源點向每一個倉庫連容量爲給定數量,費用爲 \(0\) 的邊;從每一個零售商店向超級源點連容量爲給定數量,費用爲 \(0\) 的邊,最後跑最大費用最大流。直接將權值取反而後再跑一遍最小費用最大流便可,記得跑完一遍後記得重置每條邊當前流量。

其實這種簡單題的建模不難,對着題意模擬,把每種可能的狀況考慮進去就好了。

P4013 數字梯形問題

若是理解了最上面三條東西能夠秒殺。

路徑互不相交說明啥?點不能重複選唄,那就拆點而後兩點之間連容量爲 \(1\) 的邊。

路徑僅容許在數字結點處相交說明啥?邊不能重複選,點能夠重複選唄,那就兩點之間容量搞成 \(\infty\),從上一層走到下一層的邊容量搞成 \(1\)(容易發現上一種狀況這裏設成大於 \(1\) 的均可行)。

路徑隨便相交怎麼辦?除了從超級源點到最上面的 \(m\) 個點容量設爲 \(1\) 外其它容量所有 \(\infty\) 唄。

P2765 魔術球問題

神仙題,真的神仙。

依次塞球,若是塞不下了就加一根柱子,直到柱子不夠爲止。

那麼具體咋建圖呢?依舊考慮拆點,但拆點的做用有所不一樣,這裏僅僅是爲了方便處理,將每一個球拆成出球(疊在一個球上面)和入球(一個球疊在它上面)。

從超級源點向每一個入球連容量爲 \(1\) 的邊,從每一個出球向超級匯點連容量爲 \(1\) 的邊。再從每對合法的較小的入球向較大的出球連邊。

能夠發現,從超級源點到超級匯點最長只存在長度爲 \(3\) 的正向路徑!舉個栗子:\(S\to in_1\to out_3\to T\)

但這樣剛好表明了一個球的堆疊!接下來:\(S\to in_3\to out_6\)

這樣就堆疊了兩個球!因此就這樣每次新加一個球,若是最大流沒有增長,說明須要一根新的柱子。

接着來考慮第二問:怎麼找方案?

好像把全部路徑擼出來而後重組一下是可行的,但這裏給一種普適性不好的作法(顯然本題流量僅有 \(0\)\(1\))。

考慮一條正向邊,若是它被選了,那麼流量必定爲 \(1\)。DFS 下去,遇到這樣的邊而且出點尚未用過,就把流量置爲 \(1\) 而後繼續遞歸下去。

從超級匯點到入球都沒有問題,到出球時直接輸出。

至於正確性嘛,流量爲 \(1\) 的邊確定是流滿的嘛,那還能咋流呢?不可能出現兩條同時流滿的邊嘛。

P2774 方格取數問題

黑白染色,由相鄰的黑點向白點連容量爲 \(\infty\) 的邊。

黑點接到超級源點上,白點接到超級匯點上,權值爲對應的數。

想要合法,無非就是一些點不選。顯然中間的邊是不會去刪的,只會刪兩邊的邊。求出最小割(不連通說明合法)而後拿總權值減一下就行了。

相關文章
相關標籤/搜索