二分圖基礎:
最大匹配:匈牙利算法
最小點覆蓋=最大匹配
最小邊覆蓋=總節點數-最大匹配
最大獨立集=點數-最大匹配
網絡流:
技巧:
1.拆點為邊,即一個點有限制,可將其轉化為邊
BZOJ1066,BZOJ1305
2.考慮左右兩部,即比如橫豎、男女、比賽和人等。
BZOJ1532
帶下界網絡流問題
----------------------轉自zyf-zyf
ss和tt為附加源或者說超級源
1.無源匯上下界可行流
對於(u,v)有向邊,上界為a,下界為b 構圖方法為:
(1) ss 到 v 容量為 b
(2) u 到 tt 容量為 b
(3) u 到 v 容量為 a-b
求ss-tt最大流,當且僅當 maxflow=sigma(i,tt)=sigma(ss,i) 時 存在可行流
2.有源匯上下界最小流
如果發現原圖有源匯,要先轉化為無源匯
其他點如1方法,建圖,另加 t-s 容量為 inf
求一遍 ss-tt最大流,此時s-t的流量為 t-s這條邊的反向邊的流量,記為 x
在殘量網絡中刪去 t-s 邊,具體方法為 e[i].v:=0 e[i xor 1].v:=0
求一遍 t-s最大流(注意是 t-s),記此時的最大流為y
則最小可行流為x-y (可以理解為求出一個可行流,然后退掉了一些無用流)
3.有源匯上下界最大流
構圖如2,只是求完ss-tt最大流后,不做記錄,也不刪邊,直接在殘量網絡上求s-t最大流,即為答案
(可以理解為,求出一個可行流后,發現還可現流更多的流,就求s-t最大流 之所以可以不刪邊
是因為第一次ss-tt最大流完了之后s-t的流量存在 t-s的反向邊s-t中,在跑s-t最大流的時候已經將其算入答案)
題目:BZOJ2502、BZOJ2150、BZOJ1458、BZOJ3876
----------------------end
流量平衡方程構圖法:
例子:noi2008志願者招募,bzoj1283序列
列出式子,添加輔助變量變成等式。上下相減。
常數和為0,將每個式子當作一個點
常數為正,則(s,x),容量為常數,費用為0
常數為負,則(x,t) 容量為常數絕對值,費用為0
對於每個變量,正的向負的連容量為inf,費用根據題目。(輔助變量費用為0)
然后就可以費用流解決啦
-------------------------------------------------------
費用與流量平方 ——拆邊,費用分別為1,3,5,7,9....
最小割問題的總結:
*意義
1.加inf的邊表示不能被割,通常用於體現某個點必須屬於某個集合
連邊(s,u,w)代表如果u不在s割的話需要付出代價w
2.連邊(u,v,w)代表如果u在s割,v在t割需要付出代價w 但注意,如果u在t割,v在s割是不需要付出代價的。 那么如果連邊(u,v,w)以及(v,u,w)則說明當u與v所屬割不同的時候需要付出代價w
*技巧
0.當求一些最大問題時,常常用sum減去代價
這個代價要求最小,於是可以用最小割解決
1.兩個點i,j屬於不同集合時付出val代價
新建點k (s,k,val) (k,i,inf) (k,j,inf)
當vals,valt不同時通常要新建點
但當相同時,可以直接(u,v,w)(v,u,w)表示不在一個集合就付出w代價
----------其實這就是最大權閉合子圖的解決方法,因為兩點必須在同一集合,所以他們之間可以連inf的邊表示不可分離
例題:BZOJ1497,BZOJ2127,BZOJ1934
2.兩個點屬於同一集合付出val代價
這個時候通常圖的性質是二分圖。(求打臉
然后我們可以將兩部點的性質翻轉一下,即左部點連s表示選,右部點連t表示選。
所以轉化后問題變為了第一個。且只需 (i,j,val) (j,i,val)
例題:BZOJ1976,BZOJ2132,BZOJ3275
3.如果有負權
比如一個點屬於s集合收益x,屬於t集合收益y, (x,y可能為負數),兩個點之間還有二元關系(二分圖),即一個點有可能選擇負收益,求最大收益
還是先按照技巧0,將所有正權可能的收益加起來,考慮去掉最小代價
普通的二元關系等通過技巧2、3建邊
那負權收益如何處理呢?考慮將負權應該連向的邊s和t交換,權值再取反。
因為一開始的最大值中就沒有加負權,如果要割斷該點,一定是正權邊和負權邊一起被割斷,答案合法。如果不在此處隔斷,即兩邊均不需割,答案不變,恰好是取正權的答案。
(語死早,還不肯定自己講的是對的23333
相關論文:彭天翼 《淺談一類最小割問題》