目录:
1)无源汇上下界可行流
2)有源汇上下界可行流
3)有源汇上下界最大流
4)有源汇上下界最小流
5)有源汇上下界最小费用流
6)例题
#无源汇#:指没有规定源点和汇点,有源汇反之。
#可行流#:可行流指任意可以流通的一种网络流方案。
网络流必知:
1.除了源点汇点,所有点流入的流量和流出的流量是相等的,时时刻刻都是。
2.每一条边的流量==反向边流量。
题目类型:给出一个网络图,n个点,m条边(有向无向皆可),每条边限制最大流量c,最小流量b。有源汇的图还会告知源点s,汇点t。
1)无源汇上下界可行流
此类题目一般判断 网络流是否可以满足流量的上下界限制并流通,比如下图A->C就是不流通的。
方法:将下界分离出来。
1)对于每条边(u,v):cap = c-b //自由容量,将下界分离
2)设数组bout[],记录每一个点的 出边下界和 减 入边下界和。
设虚拟源点SS,虚拟汇点TT
遍历点,对每一个点u:
若bout[u]>0 建立边 (u,TT) cap=bout[u]。
若bout[u]<0 建立边(SS,u) cap= - bout [u],
设变量bflow记录所有(u,TT) cap之和(用于验证满流)
4)求SS -> TT的最大流,若等于bflow,则存在可行流,否则图不流通。
#理解#:
c-b是多余的容量,可流可不流,称为自由流,建立这样的边,就可用普通的网络流求最大流了。
对于分离出来的下界边,则要要求他们全部满流!
出边连接tt,入边连接ss,求ss->tt的最大流,若等于下界出边之和(或入边之和)则说明下界全部满流了。
可行流的计算:
若验证存在可行流,每一条边的真实流量=下界+新图中该边流量
2)有源汇上下界可行流
方法:添加边 t->s,容量为INF(正无穷),此图变为无源汇上下界可行流。
#理解#:由于有源汇网络流中,除源汇点,每个点的入流恒等于出流,s->t的流量 == t->s的流量,让s->t循环起来。
3)有源汇上下界最大流
方法:建图同 有源汇上下界可行流。
1.跑一遍ss->tt最大流,记下t->s边上的流量为sum1;
2.删掉附加边(与ss,tt相连的所有边),删掉添加的t->s那条无穷边,流量值不要动。变为残量网络。
3.在残量网络上 跑一遍s->t 最大流,记为sum2.
s->t的真正最大流 = sum1 + sum2
#理解#:
t->s的流量始终等于s->t的流量。
第一遍ss->tt最大流,验证是否有可行流,同时记下 s->t 流过了多少流量。
第二遍直接残量网络上的求s->t最大流。
第一遍时s->t的流量记下来,然后在残余的网络上跑一遍s->t,此时得到的最大流不包含第一遍最大流时通过的流量,故答案为两遍之和。
4)有源汇上下界最小流
方法:建图同 无源汇上下界可行流。
1.跑一遍ss->tt最大流,记为sum1。
2.添加边 t->s,容量为INF(正无穷)
3.再跑一遍ss->tt最大流,记为sum2。
若sum1+sum2 == 下界出边之和,则有解,否则无解。
s->t最小流 = s->t边上的流量。
#理解#:
第一遍最大流,因为没有t->s边,流量不同,那么流量会尽量在图里流通。然后建边t->s,再求ss->tt最大流,这时s->t的流量就是尽量小的了,即最小流。
5)有源汇上下界最小费用流
待整理。。。。
6)例题讲解
LOJ 115 无源汇有上下界可行流http://blog.csdn.net/winter2121/article/details/79428557
LOJ 116 有源汇有上下界最大流http://blog.csdn.net/winter2121/article/details/79428792
LOJ 117 有源汇有上下界最小流http://blog.csdn.net/winter2121/article/details/79429920