•参考资料
[1]:上下界网络流学习笔记
[2]:上下界网络流问题
[3]:上下界网络流
•理解
重在处理下界的限制。
对于一条边$u->v$,下界为$l$,上界为$r$。我们可以将这条边变为上界为$r-l$,下界为$0$。
相当于在可行流的基础上每条边的流量都减小了$l$。但是这样做了之后,流量却不守恒了。
流入$v$的流量少了$l$,流出$u$的流量也少了$l4。
所以要增加一个叫附加流的东西,使得这个附加流和我们的初始流合并之后满足流量守恒
即:
如果某个点在所有边流量等于下界的初始流中满足流量守恒,那么这个点在附加流中也满足流量守恒,
如果某个点在初始流中的流入量比流出量多$x$,那么这个点在附加流中的流出量比流入量多$x$.
如果某个点在初始流中的流入量比流出量少$x$,那么这个点在附加流中的流出量比流入量少$x$.
$x的值$可以枚举x的所有连边求出。比较方便的写法是开一个数组$du[]$,在输入边的时候,对于出点$u$,$du[u]-=l$,对于入点$v$,$du[v]+=l$
$du[i]$表示i在初始流中的流入量-流出量的值,那么$du[i]$的正负表示流入量和流出量的大小关系
建立一个超级源点$S$和超级汇点$T$,然后枚举所有的点$i$,
如果$du[i]<0$,则加$(i,T,-du[i])$,如果$du[i]>=0$,则加$(S,i,du[i])$
然后跑最大流,如果满流(也就是跑完最大流后所有正向边都为0)是可行的,否则不可行
最后,每条边在可行流中的流量=容量下界+附加流中它的流量(即跑完dinic之后所加反向边的权值).
•例题
【题目】
【代码】