无源汇有上下界可行流
法一(据说适合点少边多的图):
建图方法
- 首先建立附加源点ss和附加汇点tt
- 对于原图中的边x->y,若限制为[b,c],那么连边x->y,流量为c-b
- 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和
- 若d(i)>0,那么连边ss->i,流量为d(i)
- 若d(i)<0,那么连边i->tt,流量为-d(i)
求解方法
- 在新图上跑ss到tt的最大流
- 若新图满流,那么一定存在一种可行流
- 此时,原图中每一条边的流量应为新图中对应的边的流量+这条边的流量下界
法二(据说适合点多边少的图):
建图方法
- 首先建立一个源点ss和一个汇点tt,一般称为附加源和附加汇。
- 对于图中的每条弧<u,v>,假设它容量上界为c,下界b,那么把这条边拆为三条只有上界的弧。
- 一条为<ss,v>,容量为b;
- 一条为<u,tt>,容量为b;
- 一条为<u,v>,容量为c−b。
(其中前两条弧一般称为附加弧。)
求解方法
- 以ss为源点,以tt为汇点,对这张图跑最大流。
- 如果所有的附加弧都满流,则原图有可行流。
- 这时,每条非附加弧的流量加上它的容量下界,就是原图中这条弧应该有的流量。
理解方法
对于原图中的每条弧,我们把c−b称为它的自由流量,意思就是只要它流满了下界,这些流多少都没问题。
既然如此,对于每条弧<u,v>,我们强制给v提供b单位的流量,并且强制从u那里拿走b单位的流量,这一步对应着两条附加弧。
如果这一系列强制操作能完成的话,也就是有一组可行流了。
注意:这张图的最大流只是对应着原图的一组可行流,而不是原图的最大或最小流。
有源汇有上下界可行流
建图方法
- 在原图中添加一条边t->s,流量为inf
- 其余建图方法与无源汇有上下界可行流相同
求解方法
- 同无源汇有上下界可行流
- 弧<t,s>的流量就是原图的总流量
理解方法
有源汇相比无源汇的不同就在于,源和汇是不满足流量平衡的,那么连接<t,s>之后,源和汇也满足了流量平衡,就可以直接按照无源汇的方式建模。
注意:这张图的最大流只是对应着原图的一组可行流,而不是原图的最大或最小流。
有源汇有上下界最大流
建图方法
- 同有源汇有上下界可行流
求解方法
- 在新图上跑ss到tt的最大流
- 若新图满流,那么一定存在一种可行流
- 记此时∑f(s,i)=sum1 ,即此时t->s的最大流,也就是求反向边s->t的流量
- 将t->s这条边拆掉,在新图上跑s到t的最大流
- 记此时∑f(s,i)=sum2 ,即maxflow(s,t)
- 最终答案即为sum1+sum2
理解方法
为什么要在已经有了流量的图上跑最大流?因为那张图保证了每条弧的容量下界,在这张图上跑最大流,实际上就是在容量下界全部满足的前提下尽量多得获得“自由流量”。
有源汇有上下界最小流
建图方法(常用的一种)
- 按照有源汇可行流的方法建图,但是不要建立<t,s>这条弧。
求解方法
- 求ss->tt最大流
- 连边t->s,inf
- 求ss->tt最大流
- 若满流,则存在可行流,答案即为边t->s,inf的实际流量
理解方法
在跑完有源汇可行流之后,弧<t,s>的流量就是原图的流量。
第一遍做的时候并无t->s这条边,所以s->t的流量已经尽力往其它边流了。
加上t->s这条边后,流过这条边的都是些剩余的流不到其他边的流量,从而达到尽可能减少t->s这条边上的流量的效果,即减小了最终答案。
注意:最小流判断是否有可行解的位置与时机与另外几种上下界网络流的不同!
有源汇有上下界费用流
法一(据说适合点少边多的图):
建图方法
- 首先建立附加源点ss和附加汇点tt
- 对原图中某边x->y,若限制为[b,c],费用为cost,那么连边x->y,流量为c-b,费用为cost
- 对原图中某点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和
- 若d(i)>0,那么连边ss->i,流量为d(i),费用为0
- 若d(i)<0,那么连边i->tt,流量为-d(i),费用为0
- 连边t->s,流量为inf,费用为0
求解方法
- 跑ss->tt的最小费用最大流
- 答案即为(求出的费用+原图中边的下界*边的费用)
法二(据说适合点多边少的图):
建图方法
- 首先建立附加源ss和附加汇tt。
- 对于图中的每条弧<u,v>,假设它容量上界为c,下界b,费用为cost那么把这条边拆为三条只有上界的弧。
- 一条为<ss,v>,容量为b,费用为0;
- 一条为<u,tt>,容量为b,费用为0;
- 一条为<u,v>,容量为c−b,费用为cost。
求解方法
- 跑从ss到tt的费用流
- 答案即为(求出的费用+原图中边的下界*边的费用)