zoj 3229 有源匯有上下界的最大流模板題

2021-09-07 05:56:45 字數 1236 閱讀 5363

/*坑啊,pe的程式在zoj上原來是wa。
題目大意:乙個屌絲給m個女神拍照。計畫拍照n天,每一天屌絲最多個c個女神拍照,每天拍照數不能超過d張,並且給每乙個女神i拍照有數量限制[li,ri], 對於每乙個女神n天的拍照總和不能超過gi,假設有解求屌絲最多能拍多少張照,並求每天給相應女神拍多少張照;否則輸出-1。 解題思路:增設一源點st,匯點sd。st到第i天連一條上界為di下界為0的邊,每乙個女神到匯點連一條下界為gi上界為oo的邊,對於每一天,當天到第i個女孩連一條[li。ri]的邊。 建圖模型:源點s。終點d。超級源點ss,超級終點dd。首先推斷是否存在滿足全部邊上下界的可行流。方法能夠轉化成無源匯有上下界的可行流問題。

怎麼轉換呢? 增設一條從d到s沒有下界容量為無窮的邊,那麼原圖就變成了乙個無源匯的迴圈流圖。接下來的事情一樣,超級源點ss連i(du[i]>0),i連超級匯點(du[i]<0), 對(ss。dd)進行一次最大流。當maxflow等於全部(du>0)之和時,有可行流。否則沒有。 當有可行流時。刪除超級源點ss和超級終點dd,再對(s。d)進行一次最大流,此時得到的maxflow則為題目的解。為什麼呢? 由於第一次maxflow()僅僅是求得全部滿足下界的流量,而殘留網路(s,d)路上還有很多自由流(沒有和超級源點和超級匯點連線的邊)沒有流滿, 全部終於得到的maxflow=(第一次流滿下界的流+第二次能流通的自由流)。

*/ #include#include#includeusing namespace std; #define n 1500 #define ii 400000 #define inf 0x3fffffff struct node bian[ii*2]; int head[n],yong,dis[n],work[n]; void init() void addbian(int u,int v,int w,int f) void add(int u,int v,int w,int f) int min(int a,int b) } } return 0; } int dfs(int s,int limit,int t) } } return 0; } int dinic(int s,int t) return ans; } int main() id=0; for(i=1;i<=n;i++) } add(t,s,inf,inf); suma=0; for(i=s;i<=t;i++) else add(i,t,-w[i],0); } int f=dinic(s,t); if(f==suma) else printf("-1\n"); printf("\n"); } return 0; }

zoj 3229 有源匯上下界最大流

處理有源匯有上下界最大流問題是 1.構造附加網路 2.對ss tt求最大流 ss tt滿流則有解 3.若有解,對s t求最大流 而有源匯有上下界最小流問題則是 1.構造附加網路 不新增 t,s 邊 2.對ss tt求最大流 3.新增 t,s 邊 4.對ss tt求最大流 5.若ss tt滿流,則 t...

zoj 3229 上下限網路流

上下限網路流 做法 假設有邊x y a,b 建立臨時節點ss,tt,連線x y 0,b a x ss 0,a tt y 0,a 最後連線t s 0,inf 先對tt ss跑最大流,如果tt的每一條邊都是滿流,那麼就存在解,否則無解,如果想求最大流,只需要在殘餘圖上跑s t的最大流,因為ss點沒有出邊...

117 有源匯有上下界最小流

題目描述 n nn 個點,m mm 條邊,每條邊 e ee 有乙個流量下界 lower e text e lower e 和流量上界 upper e text e upper e 給定源點 s ss 與匯點 t tt,求源點到匯點的最小流。輸入格式 第一行兩個正整數 n nn m mm s ss t...