前言
不错的文章:
https://www.cnblogs.com/liu-runda/p/6262832.html
https://www.cnblogs.com/leason-lyx/p/11144527.html
无源汇上下界可行流:
模型:一个网络,求出一个流,使得每条边的流量必须 ≥ L \ge L ≥L且 ≤ R \le R ≤R,每个点必须满足总流入量 = 总流出量 (流量守恒) (这个流的特点是循环往复,无始无终)
考虑到如果存在一个可行流,那么每条边的流量至少是 L L L,于是我们可以预先让它先流 L L L
这样以后一个点流入量可能就不为流出量了
我们考虑求出一个附加流,每条边的最终流量为附加流流量加上 L L L
具体而言,我们建边建成 ( u , v , R − L ) (u,v,R-L) (u,v,R−L)
考虑到最后要让流量平衡,分类讨论:
如果一个点的初始流入 = 流出那么它平衡了
如果初始流入 > 流出,那么这个点在附加流中流入 < 流出,称为
A
A
A 类点
如果初始流入 < 流出,那么附加流流入 > 流出,称为
B
B
B 类点
记差量为
∣
Δ
∣
|\Delta|
∣Δ∣
为了使流量平衡,我们建立超级源汇
S
,
T
S,T
S,T,
S
S
S 向
A
A
A 类点连边,流量为
∣
Δ
∣
|\Delta|
∣Δ∣
B
B
B 类点向
T
T
T 连边,流量为
∣
Δ
∣
|\Delta|
∣Δ∣
容易发现,与源点汇点
S
,
T
S,T
S,T向连的边边权和是相等的
有解当且仅当把不平衡的流量填平,也就是
S
,
T
S,T
S,T 的所有出边入边满流
跑一个 S S S 到 T T T 的最大流即可
有源汇上下界可行流
源点和汇点的流量始终不会平衡
考虑到源点出去的流量 = 汇点进的流量,汇点向源点连流量 + ∞ +\infty +∞ 的边就可以平衡
整个可行流的流量就是汇点到源点那条边的流量
有源汇有上下界最大流
在满足可行即流量平衡的条件下流量最大
建图如上,我们发现残余网络中有些边是没有跑满的
把与超级源汇的边断开,然后在残余网络上跑一个原图 S , T S,T S,T 的最大流
最终的最大流需要加上原本的可行流
最小流可以倒过来跑, T T T 到 S S S
无源汇上下界最小费用可行流
同样建立超级源汇 S , T S,T S,T
对于边 ( u , v , L , R , c o s t ) (u,v,L,R,cost) (u,v,L,R,cost),建边 ( u , v , R − L , c o s t ) (u,v,R-L,cost) (u,v,R−L,cost),并将初始值加上 L ∗ c o s t L*cost L∗cost
对于那些流量不平衡的点,建边同 “ 无源汇上下界可行流 ”,费用为 0
然后跑 S S S 到 T T T 的最小费用最大流
有源汇加一条原图中 ( T , S , ∞ , 0 ) (T,S,\infty,0) (T,S,∞,0)