网络流基础

1.流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负容量 c(u,v)>=0。如果(u,v)不属于E,则假定c(u,v)=0。流网络中有两个特别的顶点:源点s和汇点t。下图展示了一个流网络的实例 (其中斜线左边的数字表示实际边上的流,右边的数字表示边的最大容量):

对一个流网络G=(V,E),其容量函数为c,源点和汇点分别为s和t。G的流f满足下列三个性质:
      容量限制:对所有的u,v∈V,要求f(u,v)<=c(u,v)。
      反对称性:对所有的u,v∈V,要求f(u,v)=-f(v,u)。
      流守恒性:对所有u∈V-{s,t},要求∑f(u,v)=0 (v∈V)。

容量限制说明了从一个顶点到另一个顶点的网络流不能超过设定的容量,就好像是一个管道只能传输一定容量的水,而不可能超过管道体积的限制;反对称性说明了
从顶点u到顶点v的流是其反向流求负所得,就好像是当参考方向固定后,站在不同的方向看,速度一正一负;而流守恒性说明了从非源点或非汇点的顶点出发的点
网络流之和为0,这有点类似于基尔霍夫电流定律,且不管什么是基尔霍夫电流定律,通俗的讲就是进入一个顶点的流量等于从该顶点出去的流量,如果这个等式不
成立,必定会在该顶点出现聚集或是枯竭的情况,而这种情况是不应该出现流网络中的,所以一般的最大流问题就是在不违背上述原则的基础上求出从源点s到汇点
t的最大的流量值,显然这个流量值应该定义为从源点出发的总流量或是最后聚集到t的总流量,即流f的值定义为|f|=∑f(s,v) (v∈V)。



2.在求解最大流的问题前,必须对三个概念有所了解:残留网络,增广路径和割。下面先给出这三个概念的基本内容。

a.在给定的流网络G=(V,E)中,设f为G中的一个流,并考察一对顶点u,v∈V,在不超过容量c(u,v)的条件下,从u到v之间可以压入的额外网
络流量,就是(u,v)的残留容量,就好像某一个管道的水还没有超过管道的上限,那么就这条管道而言,就一定还可以注入更多的水。残留容量的定义
为:cf(u,v)=c(u,v)-f(u,v)。而由所有属于G的边的残留容量所构成的带权有向图就是G的残留网络。下图就是上面的流网络所对应的残留
网络:

残留网络中的边既可以是E中边,也可以是它们的反向边。只有当两条边(u,v)和(v,u)中,至少有一条边出现在初始网络中时,边(u,v)才会出现在残留网络中。下面是一个有关残留网络的定理,若f是G中的一个流,Gf是由G导出的残留网络,f‘是Gf中的一个流,则f+f‘是G中一个流,且其值|f+f‘|=|f|+|f‘|。证
明时只要证明f+f‘这个流在G中满足之前所讲述的三个原则即可。在这里只给出理解性的证明,可以想象如果在一个管道中流动的水的总流量为f,而在该管道
剩余的流量中存在一个流f‘可以满足不会超过管道剩余流量的最大限,那么将f和f‘合并后,也必定不会超过管道的总流量,而合并后的总流量值也一定
是|f|+|f‘|。

b.增广路径p为残留网络Gf中从s到t的一条简单路径。根据残留网络的定义,在不违反容量限制的条件下,G中所对应的增广路径上的每条边(u,v)可以
容纳从u到v的某额外正网络流。而能够在这条路径上的网络流的最大值一定是p中边的残留容量的最小值。这还是比较好理解的,因为如果p上的流大于某条边上
的残留容量,必定会在这条边上出现流聚集的情况。所以我们将最大量为p的残留网络定义为:cf(p)=min{cf(u,v) |
(u,v)在p上}。而结合之前在残留网络中定理,由于p一定是残留网络中从s到t的一条路径,且|f‘|=cf(p),所以若已知G中的流f,则
有|f|+|cf(p)|>|f|且|f|+|cf(p)|不会超过容量限制。

c.流网络G(V,E)的割(S,T)将V划分成为S和T=V-S两部分,使得s∈S,t∈T。如果f是一个流,则穿过割(S,T)的净流被定义为f(S,T)=∑f(x,y) (x∈S,y∈T),割(S,T)的容量为c(S,T)。一个网络的最小割就是网络中所有割中具有最小容量的割。设f为G中的一个流,且(S,T)是G中的一个割,则通过割(S,T)的净流f(S,T)=|f|。因为f(S,T)=f(S,V)-f(S,S)=f(S,V)=f(s,V)+f(S-s,V)=f(s,V)=|f|(这里的公式根据f(X,Y)=∑f(x,y) (x∈X,y∈Y)的定义,以及前面的三个限制应该还是可以推出来的,这里就不细讲了)。
有了上面这个定理,我们可以知道当把流不断增大时,流f的值|f|不断的接近最小割的容量直到相等,如果这时可以再增大流f,则f必定会超过某个最小的割
得容量,则就会存在一个f(S,T)<=c(S,T)<|f|,显然根据上面的定理这是不可能。所以最大流必定不超过网络最小割的容量。

综合上面所讲,有一个很重要的定理:最大流最小割定理

如果f是具有源s和汇点t的流网络G=(V,E)中的一个流,则下列条件是等价的:
      1) f是G中一个最大流。
      2) 残留网络Gf不包含增广路径。
      3) 对G的某个割(S,T),有|f|=c(S,T)。

到这里为止网络流的基本知识已经讲的差不多了,下一篇中我将给出实现求解网络最大流基本思想和实现的几种算法。

网络流基础

时间: 2024-10-11 09:28:54

网络流基础的相关文章

POJ 1273 Drainage Ditches 网络流基础

Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage

[知识点]网络流基础

1.前言 这是ACM之路的第一篇文章,是在通过看自己OI生涯的文章来回顾知识点的过程中,实在难以接受当时过于含糊笼统的介绍的情况下决定开写的,真是对不住1300+的阅读量了.由于网络流的EK算法和Dinic算法就是早期的知识点系列文章,当时确实疏漏很多,现在通过我目前残缺的知识框架和基本功重新整理一下. 网络流是一个很广泛的问题,是一种类比水流的解决方案.从算法角度来看,最常见的基础算法为Dinic算法,也是本文最重要的部分.从问题角度而言,对于算法竞赛,最常见的问题莫过于最大流问题.何为最大流

【算法?日更?第三十三期】网络流基础知识(最大流)

▎写在前面 小编早就听说过了网络流这种神奇的东西,一直以为很高端大气上档次,但是很难,就没学. 今日一见也不过如此,一点也不高端,不大气,不上档次. ▎网络流 ?『定义』 网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关.网络流的理论和应用在不断发展,出现了具有增益的流.多终端流.多商品流以及网络流的分解与合成等新课题.网络流的应用已遍及通讯.运输.电力.工程规划.任务分派.设备更新以及计算机辅助设计等众多领域.(copy自百度) ?『介绍』 其实上面的度娘写

【网络流基础模板】

//网络流dinic //最大流=最小割 //基本建模 //建源汇,向每个点分别连所限制的边权,题目所给的边连inf int cnt=1; inline void insert(int u,int v,int w) { e[++cnt].to=v; e[cnt].next=head[u]; head[u]=cnt; e[cnt].f=w; } inline void insert(int u,int v,int w) { insert1(u,v,w); insert1(v,w,0); } inl

网络流基础-基本概念

网络流是一个有向图,其中有两个特殊点源点S和汇点T,每条边有容量c(权值),实际的流量f比容量c小. 三个性质: 容量限制:流量必定小于等于容量.F(x, y) <= F(y, x) 流量守恒:每个节点的总流入等于总流出.Σ F<v,x> = Σ F<x,u> 斜对称性:从a流向b为x,则从b流向a为-x. F<x,y> = - F<y,x> 三种网络: 容量网络:就是容量组成的网络. 流量网络:实际流量组成的网络. 残留网络:每条边的容量减去流量得出

网络流基础-最大流最小割定理

最大流最小割定理,指网络流的最大流等于其最小割. 最大流指符合三个性质的前提下,从S到T能流过的最大流量. 最小割指符合割的定义,最小的割容量. 求最大流: 不断寻找增广路,计算能增加的最小流量,然后增加. 找到一条增光路,最多能流过2,则: 找到第二条路径: 最后还剩a-c-e一条,则可计算出最大流量为4. 但遇到以下情况,且第一条路径为a-b-c-d时,就不行了: 此时需要增加反向路径,即当减去增广路时,反向加上减去的流量,提供后悔的选择: 这样,当考虑a-c-b-d时,可以对冲掉b-c的流

最大网络流——增广路算法

几句废话:读了刘汝佳的书之后,感觉一切都是那么茫然,于是自己在网上找教程,自己一点点码的,大概用了三天.网络流基础:看来我很有必要说一下网络流的基础网络流问题就是给你一个图,每个图的边权叫做这条边的流量,问你从起始点出发,有多少值能通过这些边流到重点我知道你没看懂,举个例子: 如图: 最大值为 从1到2到4运6个 从1到2到3到4运1个 从1到3到4运3个 一共运10个. 举例说完了,那么我说几个定义: 容量,就只一条边的权值,表示能从这条边运送的最大值 流量,表示一条边实际上流过的最大值 那么

算法复习——网络流模板(ssoj)

题目: 题目描述 有 n(0<n<=1000)个点,m(0<m<=1000)条边,每条边有个流量 h(0<=h<35000),求从点 start 到点 end 的最大流. 输入格式 第一行:4 个整数,分别是 n,m,start,end .接下来有 m 行,每行四个三个整数 a,b,h,分别表示 a 到 b,流量为 h 的一条边. 输出格式 输出从点 start 到点 end 的最大流. 样例数据 1 输入 [复制] 7 14 1 7 1 2 5 1 3 6 1 4 5

bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)

1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1和女2之间连边,流量为约束条件k 2.st连男1,女2连ed,流量为二分的mid 3.如果男生i喜欢女生j,就将男1与女2相连(不在约束条件内) 4.如果不喜欢,就将男2与女1相连(在约束条件内) 代码: 1 #include<cstdio> 2 #include<cstring> 3