首先任何有下界的边都要先记录下界的入度和与出度和,记作
in和
out。
然后对于点
i:
如果
in[i]>out[i],则建边
(ss→i,in[i]−out[i])
如果
in[i]<out[i],则建边
(i→tt,out[i]−in[i])
下面再分情况讨论其他的建边。
Case #1:无源汇上下界可行流
跑
ss到
tt的最大流。
结论:如果能使
ss临边全部满流就存在可行流。对应每条边在原图的流量是下界+流过去的流量。
Case #2:有源汇上下界可行流
建边
(t→s,+∞),跑
ss到
tt的最大流。
结论同上:如果能使
ss临边全部满流就存在可行流。原图的总流量就是边
(t→s,+∞)的流量。对应每条边在原图的流量是下界+流过去的流量。
Case #3:有源汇上下界最大流
建边
(t→s,+∞),跑
ss到
tt的最大流。记边
(t→s,+∞)的流量为
f1
断掉边
(t→s,+∞),跑
s到
t的最大流
f2。
结论同上:如果能使
ss临边全部满流就存在可行流。原图的总流量就是
f1+f2。对应每条边在原图的流量是下界+流过去的流量。
Case #4:有源汇上下界最小流
先不建边
(t→s,+∞),跑
ss到
tt的最大流看是否可行。
然后建边
(t→s,+∞),跑
ss到
tt最大流。此时边
(t→s,+∞)的流量就是原图最小流。对应每条边在原图的流量是下界+流过去的流量。