最大流笔记(三)

3.4 有上下界的网络流

无源汇有上下界的可行流

Description

给出一个\(N\)个点\(M\)条边的有向图,每条边都有一个容量下限\(l\)和容量上限\(r\),即每条边的流量必须在\([l,r]\)的区间内,没有源点和汇点,问是否存在满足限制的一道流。

Solution

思路就是将有上下界的网络转化为没有下界限制的网络。把原来的容量为\([l,r]\)的边分为两条没有下限的边,一条容量为\(l\),是必须要流满的,称为“必要弧”,另一条边的容量为\(r-l\)

由于必要弧的有一定要满的限制,将必要弧“拉”出来集中考虑。

添加两个点\(x\)\(y\),并且\(y\)\(x\)有一条容量无限大的边,把每一条必要弧改为先统一进入\(y\)点,流到\(x\)点后统一流出。因为边\((y,x)\)的容量为无限大,所以原网络中有可行流当且仅当新网络中有可行流。

因为每条必要流都必须流过\((y,x)\)边,于是去掉这条边,从\(x\)\(y\)跑最大流,如果满流,则说明原图存在可行流。

实现上,令\(in[i]\)\(i\)点必须要流入的流量,\(out[i]\)\(i\)点必须要流出的流量,\(x\)到每个点\(i\)连一条容量为\(in[i]\)的边,\(i\)\(y\)连一条容量为\(out[i]\)的边,从\(x\)\(y\)跑最大流,如果满流,则说明所有的必要弧可以流满,存在可行流。否则不存在可行流。

另法:另\(du[i]=in[i]-out[i]\)表示\(i\)点净的要流入的流量,遍历每个顶点,如果\(du[i]>0\),就从\(x\)\(i\)建一条容量为\(du[i]\)的边,如果\(du[i]<0\),就从\(i\)\(y\)建一条容量为\(-du[i]\)的边。从\(x\)\(y\)跑最大流,如果满流,说明原图存在可行流。

有源汇有上下界的可行流

从汇点到源点建一条容量为无穷大的边,成为一个无源汇的网络,另外添加超级源点\(ss\)和超级汇点\(tt\),按上文方法建图。新网络中的每一道可行流对应原网络中的一道可行流,新网络中的最大流对应原网络中的最大流。

有源汇有上下界的最大流

从汇点\(t\)到源点\(s\)建边成为无源汇的网络,二分最大流的值,作为从\(t\)\(s\)的边的容量,判断如果存在可行流,说明合法,反之不合法。

令法:从汇点\(t\)到源点\(s\)建一条容量为无穷大的边转化为无源汇的网络,添加超级源点\(ss\)和超级汇点\(tt\),按上文给的第二种方法建边,判断存在可行流。删除超级源点和超级汇点,从原来的源点\(s\)到原来的汇点\(t\)跑最大流,此时就是原网络的最大流。

因为第一次从超级源点到超级汇点跑最大流时,流量存储在了从\(t\)\(s\)的无穷容量的边的反向弧中。再从\(s\)\(t\)跑最大流时,无穷大的边的反向弧中流过了必要流,原网络中流过了自由流,合起来就是原网络的最大流。

例题 ZOJ 3229 Shoot the Bullet

Description

一位摄影师要在\(n\)天给\(m\)个女孩拍照,第\(x\)个女孩至少要拍\(G_x\)张,在第\(k\)天,摄影师有\(C_k\)个目标,\(T_{k1}\)\(T_{k2}\)\(\cdots\)\(T_{kCk}\),给目标\(T_{ki}\)拍的照片的数量要在\([L_{ki},R_{ki}]\)的范围内,第\(k\)天摄影师最多只能拍\(D_k\)张照片。问在不违反这些限制条件的情况下,摄影师最多可以拍的照片数量。

Solution

左侧\(n\)个点代表\(n\)天,右侧\(m\)个点代表\(m\)个女孩,若第\(i\)天要给第\(j\)个女孩拍照片,照片数量要在\([l,r]\)范围内,则代表第\(i\)天的点到第\(j\)天的点有一条容量范围位\([l,r]\)的边。添加源点\(s\)和汇点\(t\),源点\(s\)与代表\(n\)天的点之间建容量范围为\([0,d]\)的边,代表\(m\)个女孩的点与汇点\(t\)之间有容量范围为\([g,\infty]\)的边。这样一个有源汇带上下界的流网络就建好了,求最大流即可。

posted @ 2017-08-20 17:14  达达Mr_X  阅读(191)  评论(0编辑  收藏  举报