Codeforces 708D 上下界費用流
給你一個網絡流的圖 圖中可能會有流量不平衡和流量>容量的情況存在
每調整一單位的流量/容量 需要一個單位的花費
問最少需要多少花費使得原圖調整為正確(可行)的網絡流
設當前邊信息為(u,v,f,c) 即從u到v有一條流量為f,容量為c的有向邊
設加的邊信息為[u,v,f,c] 即加一條從u到v有一條容量為f,單位費用為c的有向邊
首先如果源匯的流量不平衡的話 要加一條邊[T,S,INF,0]使得源匯流量平衡
接下來分情況討論:
①:流量f>容量c
首先ans+=f-c 因為必須調整f-c個單位的流之後 才能使該邊合法
加邊[u,v,INF,2] 這條邊的意思為f=c時 提高f需要2的花費(需要同時提高c)
加邊[v,u,f-c,0] 可用作減少流量
加邊[v,u,c,1] 可用作減少流量
邊[u,v,INF,2]很好理解 但邊[v,u,f-c,0]和[v,u,c,1]該如何理解呢
首先我們分析調整完後該邊f的流量有下列情況 1.[0,c] 2.[c,f] 3.[f,INF]
第一種情況c不需要調整 要調整的是f 因為我們預先支付了f-c費用 所以f~c階段的花費是0 而0~c的階段單位費用為1
第二種情況c和f同時需要調整 但是總費用是f-c 我們只需要利用[v,u,f-c,0]調整到想要的f即可
第三者情況c和f也同時需要調整 但是f不會減小 所以後面兩種邊就無效了
所以這三種邊就可以包括f的全部情況
②:流量f<=容量c
加邊[u,v,INF,2] 這條邊的意思為f=c時 提高一單位f需要2的花費(需要同時提高c)
加邊[u,v,f-c,1] f~c這段單位花費為1
加邊[v,u,f,1] 0~f這段單位花費為1
加完費用流的邊之後 對於每條(u,v,f,c) 都needflow[u]-=f needflow[v]+=f
對於每個點(包括源匯)
needflow[i]>0則加[SS,i,needflow[i],0] needflow[i]<0則加[i,TT,-needflow[i],0]
最後跑一次SS到TT的最小費用流 加上之前的ans 即為答案
Codeforces 708D 上下界費用流