[算法导论·ISAP]网络流学习笔记

先来学算导。。

26.1流网络

①与第二版不同,算导第三版修改了关于流的约定,约定所有流均非负;并删除了流的第二条性质(反向对称)。同时放弃了给源点以定义,允许源点入度不为0,相应的,也允许汇点出度不为0.

②一些奇怪的性质包括:流守恒,所有点必在s~>t上,两点之间最多只有一条边。

③在网络流中遇到了大量加边加点的技巧:多个源汇点的话可以添加一个超级源汇点;为反向平行边添加虚拟节点,将一条边裂解成两个。

④网络中的流为一个以0为下界的凸集。

26.2Ford-Fulkerson方法

①换取等价增加:在残留网络中寻找从s->t的简单路径。(在流网络中,任意从s到t的简单路径都是一个流。)

②等价关系:

最大流<=>在残留网络中无可增广路<=>最小割。

③EK的时间复杂度证明:

每个可增广路至少有一条关键边;

若约定每条边权重为1,则EK时在残留图中任意节点到s点的最短路径必不下降。

④26.2-11无向图的边联通性是指使图变为非连通图所需要删除的最少边数k。

即,最小割!

·转换成网络流问题:O(V^2*E)

⑤26.2-13在一个满足一个最小的前提小,找另一个最小?在保证一个不变的前提下扩大另一个的区别!

假定我们希望找到一个流网络G的所有最小切割中包含边的条数最少的切割,这里假定G的所有容量都是整数值。说明如何修改G的容量来创建一个新的流网络G',使得G‘中的任意一个最小切割是G中包含边的条数最少的最小切割。

以E*c(u,v)+1代c(u,v)即可。

乘E不会改变相对大小,但却会放大相对差距;+1会使得边数不同则割的容量不同。

ISAP算法:

①一个几乎完全类似的性质:每次增广之后,任意节点到汇点的距离也必然不下降。

推论:若一条路径在某次增广之前是最短路径,则在其增广之后只有两种可能,要么不存在了,要么依然为最短路径(因为不会有更短的路径被诞生)。

所以呢?!我们大可为每个节点保存一个下界函数d(i),作为i到t的最短距离的下界;在每次增广时,用接近汇点优先的策略寻找是否存在符合d的最短路。

对于每个节点,我们还需要保存它当前处理到哪条边了,因为d(i)是时间t的不下降函数,所以若在当前边之前的所有边在之前的遍历中已经不可能有允许拓展,则在当前状态中亦然不可能有允许拓展——之所以这样做,实际上是保证了其上界时间复杂度。

②如果在某一个节点上出现了当前d(i)过大的情况,就执行retreated,寻找最小后继,更新d(i)

——这样之所以可行是因为其更新的先后顺序决定的,若d(i)被过大,则必然是由于更新出该值的后继节点被更新导致。

——retreated操作保证了d(i)的紧密递增,一个点的d(i)不可能比其后继节点的d大2,即其必是从s开始的一棵下降连续或断裂上升的树;而不可能出现断裂下降的情况。

③GAP优化:

我们保存d(i)的每个值在当前G中的数量,若在某次retreated之后,若在残留图G中不存在与原先的d(i)相等的值,则必然意味着s与t不相连了,即我们找到了最小割、最大流。

[算法导论·ISAP]网络流学习笔记_第1张图片

GAP优化的必要性:如果不使用GAP优化的话,注意在最小割被找出之后实际上我们需要再遍历一整遍s所在的割并依次retreated每个点使得s最终被retreated,而这样做几乎相当于遍历一遍邻接表,这显然不是我们想要的,所以我们需要使用GAP优化快速判断出是否s与t已被割开。

④时间复杂度分析:

每条边至多成为关键边|V|/2次,因为关键边是会消失的边,在它消失之后即其完全成为了其原先的反向边,此时若其再成为关键路径,就意味着由d(u)=d(v)+1,变成了d'(u)=d'(v)-1,即d'(u)<=d(u)-2,因此增广次数至多为|E||V|/2次。

下面我们来讨论增广时的开销,首先注意到寻找增广路的过程是需要把点集至多遍历一遍的,这样做的花费是|V|.

然而需要注意到我们还进行了遍历邻接表的操作,我们试图均摊这样做的开销:对于每个节点v,其最多能直接抵达|V|个节点,那么出边也最多会被遍历|V|次,因为d(i)的取值范围是[1,|V|],而对于每个会出现的d(i),都需要遍历且仅遍历一遍其所有出边。

综上,ISAP算法让我们看到了下界函数在使不下降操作中的(贪心)作用,这不仅仅是对于网络流的ISAP算法,对于其他题来说也是很有用处的。

你可能感兴趣的:(网络流)