閉合子圖是什麼?數組
就是一個有向無環連通圖。網絡
最大權閉合子圖就是說,圖上的節點有正有負,咱們要選出權值最大的點集。app
建圖過程:spa
而後跑最大流,用\(\sum w(i)\ (w(i)>0)\)(全部正權點的權值和)減去求出來的最大流(最小割)就是答案。get
爲何要這樣呢?class
分類討論:im
(感受這個是最小割當中最好理解的了……)img
8.6 老師提了一個挺有意思的模型:di
有若干個活動,分別須要一些房子。使用房子有兩種方式:ant
就是說,一個負權點的代價能夠有不止一種形式。
這樣的話,本來那些鏈接正權點和負權點的,容量爲\(\infty\)的邊就有用了:
就是,一個節點有兩種代價(或者收益),還有一些限制,讓你找出最小的代價(最大的收益)
若是沒有其餘限制的話很簡單:將兩種代價(或者收益)一種連向\(S\),另外一種連向\(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}\)上的最小路徑覆蓋。
首先,由於對於一個數,有兩種流量流入:一種是其餘(比它小的)數想要和它組成徹底平方數;另外一種是它本身要和比它大的數組成徹底平方數。
因此咱們要將一個「數」拆成兩個點:一個給比它小的點去連,另外一個給它本身去連別人。
連邊的話,將小數的點的入點連向大數的點的出點(前提是小數和大數的和是徹底平方數),源點連向每一個入點,每一個出點連向匯點。
而後每次加入新數就連上相應的弧(好比將前面可以組成徹底平方數的出點和入點連弧),再在先前的殘量網絡上直接跑最大流,若是最大流沒有增長,說明這個數不能與以前的全部數組成徹底平方數,就把柱子的數量加一便可。
事實上,通常的最小路徑覆蓋也是差很少和上面同樣的,但若是要你直接輸出最小路徑數的話
就輸出\((N-最大流)\)就能夠了。(這個不難理解吧)
先來一波定義
點覆蓋:G任意邊都至少有一個頂點屬於源點\(s\)的點集\(S\);
獨立集:G中兩兩互不相連的點集\(S\)。
最小點(權)覆蓋:(點數/點權)最小的點覆蓋;
最大點(權)獨立集:(點數/點權)最大的點獨立集。
最大流=最小割=最小點覆蓋=\(N-最大獨立集\)
上面很容易證:由於是最小割,因此只要把割邊所連上的點刪除,那麼就能用最小的代價把\(s\)和\(t\)隔離開來。
可能還能夠刪掉其它的點(好比說你能夠把和源點\(s\)直接相連的全部點都刪掉,點集\(S\)就是與\(s\)直接相連的全部點),可是這樣都沒有最小割優。
而後,引入了一個點覆蓋,就說明有一對點必須二選一,因此最大獨立集就要\(-1\),由於點與點之間互不相連。
若是是普通的最小點覆蓋的話,容量設爲\(1\)便可(固然,中間二分圖的弧的容量仍是\(\infty\))。
若是是最小點權覆蓋的話,把容量設爲權值便可。
最後補充一個:二分圖最大權匹配。
按照費用流跑便可(應該要把費用取爲負數再跑)