有上下限的网络流其实很简单。只要掌握建图方法就可以了。
我碰到过的有上下限的网络流题目只分三种情况:
1、是否存在可行流;2、求最小可行流;3、求最大可行流。
还有一种变形:当存在可行流时,问每条边的流量分别是多少。
流传的论文:《一种简易的方法求解流量有上下界的网络中网络流问题》(周源)。
如果概念(可行流/最小可行流/最大可行流等)不清楚的话,还是应该好好看一下的。这篇论文用的是二分法求解,其实比较麻烦。但至少二分法做为什么是对的额,证明很清楚。
分享一下不用二分法求最小/最大可行流的方法
PS:这个是前辈流传下来的,不知道出处是什么地方,也不知道为什么这么做是对的……
感谢 jifengxiang & starvae
- 求有上下界的最小可行流:
定义边(u,v,b,c),即从点u到点v的边,流量下限是b,上限是c。
原来的边(u,v,b,c)建边u->v,容量为c-b。
in[v]代表以v为终点的流量下界和,out[u]代表以u为起点的流量下界和。
创造虚拟源点SS,汇点TT。
建边SS->i,容量为in[i]。建边i->TT,容量为out[i]。
跑一次最大流maxflow(SS,TT),加边(T,S,inf) (S,T为原始网络的源点和汇点)
再泡一次最大流maxflow(SS,TT).
检查SS的出边,如果有没有满流的,则不存在可行流,即无解。
否则最小可行流=inf-残余网络中(T,S)。
- 求有上下限的最大可行流
定义边(u,v,b,c),即从点u到点v的边,流量下限是b,上限是c。
原来的边(u,v,b,c)建边u->v,容量为c-b。
in[v]代表以v为终点的流量下界和,out[u]代表以u为起点的流量下界和。
创造虚拟源点SS,汇点TT。
建边SS->i,容量为in[i]。建边i->TT,容量为out[i]。
//以上步骤跟最小可行流一样。
对原始源点汇点连边(T,S,inf)
泡一次最大流maxflow(SS,TT)
检查SS的出边,如果有一条出边没有满流,则不存在可行流,即无解。
否则最大可行流 = maxflow(S,T) (S,T为原始网络源点与汇点)