1. 程式人生 > >Codeforces 708D 上下界費用流

Codeforces 708D 上下界費用流

同時 可用 下界 網絡流 for size flow 調整 流量

給你一個網絡流的圖 圖中可能會有流量不平衡和流量>容量的情況存在

每調整一單位的流量/容量 需要一個單位的花費

問最少需要多少花費使得原圖調整為正確(可行)的網絡流

設當前邊信息為(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 上下界費用流