1. 程式人生 > >【個人整理】網路流

【個人整理】網路流

說明:S,表示超級原點,T表示超級匯點,<i,j,k(,l)>表示i到j建邊,流量為k(,費用為l)

 bzoj4177 Mike的農場

題解:考慮割,養牛的收益為a[i],養羊b[i],對於每個位置<S,i,ai> <i,T,bi>分別表示養牛和養羊,對於兩個互相影響的位置<i,j,ci>;做最小割可以滿足前兩個限制 ;第三個限制,如果全養牛可以獲得d,新建一個點x,考慮要求全養牛的位置為集合為s,<S,x,d> , <x,si,inf> , 當si中有一個沒有被割,那麼<S,x,d>一定被割,最小割為c,ans = $( \sum (a[i]+b[i]) + \sum c[i]  ) – C $

         


bzoj3504 [cqoi2014]危橋

題解:a1->a2 an次,b1->b2 bn次 , 邊有通過次數的限制;直接跑最大流判斷會有問題,因為可能會有a1->b2 , b1->a2的路徑充當流量,交換a1,a2再反向跑一邊即可;

bzoj2039[2009國家集訓隊]employee

題解:首先<i,T,Ai>表示是否選擇購買,考慮每對經理(i,j) , <S,i,Ei,j> <S,j,Ei,j> <i,j,2*Ei,j> , 這個網路可以化簡:<S,i,$\sum_{j}Ei,j$> <i,T,Ai> <i,j,2*Ei,j>,假設最小割為C,E的和為Sum,ans = Sum – C;

bzoj1797[AHOI2009]mincut

題解:

先做一遍最大流,考慮殘量網路(要考慮反向邊),

如果一條邊有可能不滿流那麼它一定不可能為任何個割的一部分,一定滿流那麼它一定為某個割的一部分;

考慮一個最小割對應的劃分集合S集合T集,跨越ST集合的邊為割,那麼殘網中一定只存在T->S的邊,假設存在S-T的邊,要麼為某個S->T的正向邊要麼為某個T->S反向邊,前者不符合割後者不符合最小(感性理解吧。。。。);

所以在殘網中做scc,設i所在scc為bl[i] , 首先bl[S]!=bl[T],對於殘網中的邊(u,v):

①如果bl[u]==bl[v],一定不可能為割邊

②如果bl[u]!=bl[v]且bl[u]==bl[T]&&bl[v]==bl[S],則一定為割邊,否則在縮點後的殘網DAG上一定可以有一個另外的割;

bzoj3158 千鈞一髮

題解:考慮ai,aj均為奇數,令ai=2k1+1,aj=2k2+1,畫一畫ai^2+aj^2發現不滿足①,考慮ai,aj都為偶數,顯然不滿足②,於是轉成最小割做就好;

bzoj1061 [Noi2008]志願者招募

題解:

orz byvoid

 https://www.byvoid.com/zhs/blog/noi-2008-employee

還有一種上下界的做法:

https://www.cnblogs.com/nietzsche-oier/p/8205275.html

bzoj3876 []