深刻淺出網絡流

最小割

最大權閉合子圖

閉合子圖是什麼?數組

就是一個有向無環連通圖網絡

最大權閉合子圖就是說,圖上的節點有正有負,咱們要選出權值最大的點集。app

建圖過程:spa

  1. \(S\xrightarrow{w(i)} i\ (w(i)>0)\)
  2. \(i\xrightarrow{\infty} j\ ((i,j)\in E)\)
  3. \(i\xrightarrow{-w(i)}T\ (w(i)<0)\)

而後跑最大流,用\(\sum w(i)\ (w(i)>0)\)全部正權點的權值和)減去求出來的最大流(最小割)就是答案。get

爲何要這樣呢?class

分類討論:im

  1. 若是正權邊被割了,那就說明在最小割中,正權邊\(\leqslant\)對面的負權邊(不然被割掉的就不會是正權邊而是負權邊),對應的狀況就是:選了正權邊以後,正權邊所連通的負權邊比正權邊還大(在絕對值上),這樣選就虧本了,因此才須要割掉(在代碼中就是從正權點的權值和中減去)。
  2. 若是負權邊被割了,就說明正權邊比負權邊大,選了以後不會虧本,割掉的只是選了這個正權點所付出的最小成本。

(感受這個是最小割當中最好理解的了……)img


8.6 老師提了一個挺有意思的模型:di

有若干個活動,分別須要一些房子。使用房子有兩種方式:ant

  1. 每一個活動分別租一間
  2. 直接買一間,這樣每一個活動都能使用,不須要再額外租。

就是說,一個負權點的代價能夠有不止一種形式。

1.png

這樣的話,本來那些鏈接正權點和負權點的,容量爲\(\infty\)的邊就有用了:


二選一模型

就是,一個節點有兩種代價(或者收益),還有一些限制,讓你找出最小的代價(最大的收益)

若是沒有其餘限制的話很簡單:將兩種代價(或者收益)一種連向\(S\),另外一種連向\(T\),而後求出最小割,最小割就是最小的代價(若是是收益的話,就是必需要捨棄的最小收益)。

  1. 若是\(a\)被割給了\(S\)\(b\)被割給了\(T\),就有相應的代價;(雙核CPU善意的投票
  2. 若是一個點集被割給了\(S\),就有相應的收益;(壽司餐廳Happiness小M的做物
  3. 若是一個點被割給了\(S\),而且一個點集\(V'\)中有一個點被割給了\(T\),就有相應的代價

第一種

\[S\xrightarrow{w(a)} a \xrightarrow{\text{代價}}b \xrightarrow{w'(b)}T\]

這樣的話,求出最小割以後,割掉的就是最小的代價。

固然,像善意的投票就只須要根據意願在\(S\)\(T\)之間二選一便可(代價仍是照樣連)

第二種

代價是用來最小化的,因此用最小割能夠直接解決,那收益呢?

不要緊,能夠先把收益都加起來,而後再把收益當成代價去建弧,跑最小割。

這樣,割掉的就是最小的收益,剩下的收益天然就是最大的了。

第三種

(記不得老師講什麼了,本身腦補的)

\[T\xleftarrow{w(a)} a \xleftarrow{代價} x(附加點) \xleftarrow{\infty}(v\in V')\xleftarrow{w(v)} S\]

(畫反了,不想調)

(由於例題少因此就不講了,反正最小割目前只接觸了這兩種模型)


二分圖

\(\mathrm{DAG}\)最小路徑覆蓋

↑字面意思:用最少的路徑(不是鏈接兩個節點的)覆蓋\(\mathrm{DAG}\)上全部的點(兩條路徑不能通過相同的點)。

魔術球問題

能夠發現,若是把可以組合成徹底平方數的數對連邊,就會造成一個或以上的獨立的\(\mathrm{DAG}\)

那問題就轉化成了\(\mathrm{DAG}\)上的最小路徑覆蓋

首先,由於對於一個數,有兩種流量流入:一種是其餘(比它小的)數想要和它組成徹底平方數;另外一種是它本身要和比它大的數組成徹底平方數

因此咱們要將一個「數」拆成兩個點:一個給比它小的點去連,另外一個給它本身去連別人。

連邊的話,將小數的點的入點連向大數的點的出點(前提是小數和大數的和是徹底平方數),源點連向每一個入點,每一個出點連向匯點。

而後每次加入新數就連上相應的弧(好比將前面可以組成徹底平方數的出點入點連弧),再在先前的殘量網絡上直接跑最大流,若是最大流沒有增長,說明這個數不能與以前的全部數組成徹底平方數,就把柱子的數量加一便可。


事實上,通常的最小路徑覆蓋也是差很少和上面同樣的,但若是要你直接輸出最小路徑數的話

就輸出\((N-最大流)\)就能夠了。(這個不難理解吧)

最小點覆蓋 & 最大獨立集

先來一波定義

點覆蓋:G任意邊至少有一個頂點屬於源點\(s\)的點集\(S\)

獨立集:G中兩兩互不相連的點集\(S\)

最小點(權)覆蓋:(點數/點權)最小的點覆蓋;

最大點(權)獨立集:(點數/點權)最大的點獨立集。

最大流=最小割=最小點覆蓋=\(N-最大獨立集\)

上面很容易證:由於是最小割,因此只要把割邊所連上的點刪除,那麼就能用最小的代價\(s\)\(t\)隔離開來。

可能還能夠刪掉其它的點(好比說你能夠把和源點\(s\)直接相連的全部點都刪掉,點集\(S\)就是與\(s\)直接相連的全部點),可是這樣都沒有最小割優。

而後,引入了一個點覆蓋,就說明有一對點必須二選一,因此最大獨立集就要\(-1\),由於點與點之間互不相連


若是是普通的最小點覆蓋的話,容量設爲\(1\)便可(固然,中間二分圖的弧的容量仍是\(\infty\))。

若是是最小點覆蓋的話,把容量設爲權值便可。


最後補充一個:二分圖最大權匹配

按照費用流跑便可(應該要把費用取爲負數再跑)

相關文章
相關標籤/搜索