网络流的基本概念
网络流问题都是建立在类似上图的有向图之上,有向图的边的权值代表容量。其中A代表源点,C代表汇点,一般考察的问题情景就是从A中流出流量,经过这些有向边,最终汇集到C中。像这样的具有源点和汇点,并且每条边的权值均为正数的有向图就被称作是容量网络,图中的这些边被称作是弧,弧的权值被称作弧的容量,它代表着能够通过这条弧的最大流量。而经过弧上的实际流量被称作弧的流量,所有这些弧的流量所组成的集合就是所谓的网络流。
直观上不难发现符合实际情况的网络流的特点,或者说是限制条件。首先每条弧上的流量不能超过其容量,还有对于除了源点和汇点以外的每个点来说,流入它的流量之和必须与从它流出的流量之和相等,即平衡条件。那么满足这两个条件的网络流就被称作是可行流,可行流的流量定义为从源点所流出的所有流量之和。在所有的可行流中,流量最大的那个被称作是最大流。
对于一串顶点序列 ( U , U 1 , U 2 , U 3 , … , V ) (U,U1,U2,U3,…,V) (U,U1,U2,U3,…,V),如果满足 U U U是源点, V V V是汇点,并且序列中每相邻两个顶点之间均存在一条弧,那么就称这个顶点序列为一条链,注意这里并不要求这条弧的方向一定与有向图中的方向一致,在链中,弧被分为前向弧和后向弧,前向弧指在链中顶点的顺序与容量网络中弧的方向一致的弧,而后向弧则是方向不一致的弧。例如对于上图而言, ( A , D , B , C ) (A,D,B,C) (A,D,B,C)也是一条链,但是其中 < A , D > 、 < B , C > <A,D>、<B,C> <A,D>、<B,C>是前向弧, < D , B > <D,B> <D,B>是后向弧。
有了链的定义就可以引出增广路的概念,对于可行流的一条链 P P P,如果满足:
1. P P P中所有的前向弧的流量小于容量
2. P P P中所有的后向弧的流量均大于零
那么这条链 P P P就被称作增广路。为什么要叫作增广路呢?因为增广路上的所有前向弧都是可以继续添加流量的(增加的流量不能超过每条前向弧的容量与流量之差),而反向弧上的流量都是可以继续减少的(减少的流量不能超过反向弧的流量),这两种措施都会使得这个可行流的流量变得更大。
割指的是一个弧的集合,将这个集合中的所有弧删除后原图的基图不再连通。割将原图中的所有顶点划分为两个部分,在网络流问题中,一般考虑的都是S-T割:即割将原图的顶点划分为两个部分S和T,源点∈S,汇点∈T。例如对于上图,将顶点划分为 S = ( A , B ) 、 T = ( C , D ) S=(A,B)、T=(C,D) S=(A,B)、T=(C,