因為網上dinic模板大多不規範或者可以被卡,所以先貼出乙份跑得比較快的dinic模板(主要快在maxflow()裡面,可以仔細體會)。
struct newg
inline
void
add(
int x,
int y,
int o)
inline
bool
bfs()}
return
false;}
inline
intdinic
(const
int&now,
int flow)
return
(lev[now]=0
,res);}
inline
intmaxflow()
}return ans;
}}g2;
應該是很裸的題了。
對於每個人直接從原來的豬舍連一條邊,如果發現豬舍已經被其他人開啟過了,那麼其他人的作用相當於是合併了這幾個豬舍,直接找到最後乙個合併此豬舍的點連邊即可。最後網路流跑乙個類似最優分配的問題就行了。
####poj3281
先建立三排點,分別表示飲料,牛,食物。
注意對應的關係是牛對食物和飲料的,所以牛放在最中間。因為有限制(每頭牛為1),所以拆一下點就好了。
想了半天,最後看了題解恍然大悟:
顯然糖果可以隨意分配,但如果我把a
ia_i
ai可以為2的糖果盡量多分配出去,其他的來填剩下的就好了,所以其實是乙個最大匹配問題。
思路很簡單,首先讓與n
nn有關的比賽全贏,之後對於每個隊到s點設定乙個限制,然後盡量把與比賽之間的連邊跑滿就行了。
###2.二分
####poj2391
經典套路題。。
一種比較顯然的建圖方式是每個點新增乙個點作為最終的牛棚點並向終點連一條有限制的邊,然後原圖每個點連向自己的牛棚。
可是有時間的限制。一開始我想跑費用流,可是最後發現無法把時間累加起來,這時候經典套路就出現了:二分時間限制連邊。然後好像就做完了。。
####sgu438
加上了求最小的時間,同樣是很經典的拆點做網路流,把每個點和時間一起看做乙個點,此題依次加點就行了,也可以二分+網路流。
code:
####spoj287
首先按照題意建圖跑網路流。
據說一種網路流方案需要的顏色的數量是最大的邊的容量(這個我是真不會證明,哪位dalao證出來了麻煩給我說一下,感激不盡)。那麼直接二分就行了。
(dinic :5.3s isap : 8.0s)。
code: (可以自測一下,兩份**都有)
##3.限制點邊次數
####zoj2760
很自然的想到先保留每一條在最短路徑上的邊,並限制每條邊容量為1。
####sgu 326
同上。####spoj962
轉化為從b出發找兩條增廣路即可。
網路流建模方法(Wait)
1.求帶權 點權 依賴圖的最大價值 新建源點s 匯點t,s連向正權的點,帶負點權的點連向t,流量都為點權的絕對值,對於x y x依賴y 增加邊x y,容量為正無窮 2.最大密度子圖 方法一 二分密度,對於一密度g,我們可以建立乙個帶權 點權 依賴圖 原圖中的點與邊分別對應新圖中的乙個點,原來的點帶負...
網路流 (網路流問題彙總)
網路 1 有乙個源點 s 和匯點 t 2 每一條有向邊e u,v 都有乙個容量限制記做c e 流 定義在網路弧集上的實值函式 f 滿足三個性質 1 對任意的弧 0 f c e 容量限制。2 f u,v f v,u 反對稱性。3 流守恆性 除源匯點外,其餘頂點都是過度點,流進頂點的流總和等於流出頂點的...
有上下界網路流建模方法
無源匯可行流 建模方法 首先建立乙個源s s ss ss和乙個匯t t tt tt,一般稱為附加源和附加匯。對於圖中的每條弧v 假設它容量上界為c c c,下界b b b,那麼把這條邊拆為三條只有上界的弧。一條為,v 容量為b b b 一條為tt 容量為b b b 一條為v 容量為c b c b c...