蒟蒻通篇扯淡,如果有什么错误请轻喷。
有这样一些城市,城市和城市之间连接着一些管道,每个输水管道有一个固定的容量且单向输水,超过这个容量管道就会破裂,水流就没有办法输送。现在要求从水的源头城市将水送到远处的某个城市,这就是网络流的经典模型。
网络流是一个有向图,图中的每条有向边有一个容量,每条边的流量不大于它的容量。在图中,没有入度的节点为源点(Source),没有出度的节点为汇点(Sink),图中的每一条有向边称为一个弧。
我们设G(V,E)是一个有向图,G(V,E)中每一条边(u,v)有一个容量c(u,v),流量f(u,v),其中容量是固定的,流量是可以随时修改的。
在网络流中有几点限制(来自wikipedia):
容量限制(Capacity Constraints): | ![]() |
斜对称(Skew Symmetry): | ![]() ![]() ![]() ![]() ![]() |
流守恒(Flow Conservation): | 除非![]() ![]() ![]() |
第一条的意思很明显。
第二条其实就是每个节点流出的流量和流入的流量相等。
第三条大概是指除非源点和汇点,每个点流入的流会等量流出0-0。
我们定义一个边的剩余容量为容量与当前流量之差,即Cf(u,v)=c(u,v)-f(u,v),则这条流里剩余边构成了一个残余网络。如果在这个残余网络内仍有边有剩余容量,那么我们认为这个边是一条增广路径。在百度(xiaoxuesheng)百科上好像是把它叫可改进路或者扩张路径=-=?我们找到一条路上所有弧的最小剩余流量minn,给这条路上所有弧的流量都加上minn,一定可以保证这些弧依旧是可行弧,整个流也是可行流。通过这样的方法可以逐渐消除增广路径从而找到最大流。
最大流定理 如果当前残留网络上不存在增广路径了,那么当前流就是最大流;同样的,如果当前流不是最大流,网络中一定还存在增广路径。
网络的割切 我们将V网络整体划分成两大部分,一个叫做St,一个叫做Ed,使得source在St内,sink在Ed内,在网络中弧头(边的起点)在St,弧尾(边的终点)在Ed的所有弧构成的集合我们称为这个网络的割。
比如对于下图(手残请不要在意0-0)
图中,St={Source,A,B},Ed={C,D,Sink},割(St,Ed)的净流量f=7+2+5+1,容量c=8+9+10+1,当然净流量可以计算两个方向的弧,从St到Ed的记为正数,Ed到St的记为负数。