全球专业中文经管百科,由121,994位网友共同编写而成,共计435,895个条目

预流推进

用手机看条目

出自 MBA智库百科(https://wiki.mbalib.com/)

目录

什么是预流推进

  预流推进网络流算法中的一种较为高效的一种算法,是最高标号法的基础。可以想象在一个自来水管网的源头尽可能多的注入水流之后,最多有多少水可以流到汇点去,由网络的各个节点和管道来约束流量。将每个节点都看成一个水站,他的通过能力是有限的不能通过的水只能退回去。

预流推进的算法

  预流推进算法给每一个顶点一个标号h(v),表示该点到t的最短路(在残量网络中)。

  第一步hights()过程,就是BFS出初始最短路,计算出每一个结点的h(v)。//可以看作是汇点有“吸力”,使每个结点有不同的负压,在“负压”作用下把来自源点的流吸过去。

  预流推进算法的特征是运用了预流来加快运算。预流说明图中的结点(除s, t),仅需要满足流入量 >= 流出量。其中流入量>流出量的结点,我们称之为活动结点。/*换句话说就是有流可吸,还没吸到地方。*/我们的算法就是不断地将活动结点,变为非活动结点,使得预流成为可行流。

  算法过程prepare(),即首先将与s相连的边设为满流,并将这时产生的活动结点加入队列Q。这是算法的开始。

  以后便重复以下过程直到Q为空:

  (1).选出Q的一个活动结点u。并依次判断残量网络G'中每条边(u, v),若h(u) = h(v) + 1,则顺着这些边推流,直到Q变成非活动结点(不存在多余流量)。(Push推流过程)//同时把所有v加入活动结点的队列。

  (2).如果u还是活动结点。则需要对u进行重新标号:h(u) = min{h(v) + 1},其中边(u,v)存在于G' 中。然后再将u加入队列。(reCalc过程)//后面都满流时就吸不动了,负压自然也要重新计算。

  可以证明,通过以上算法得到的结果就是最大流。

  显然每次循环后标号和残量网络都是相容的。算法结束时Q为空,只可能是没有活动结点。因为一开始就把从源所有的流推了出来,只可能是要么能够推到汇要么最后退回源。显然,一开始源的标号最高,退回源说明源汇之间已被切断,否则总能杀出一条增广路来。

  如果该算法的Q是标准的FIFO队列,则时间复杂度为(n2m),/*最高标号不会超过n(超过时必无到汇的路径),所以n个点每个最多重新标号n次,两次标号之间m条边每条最多推流一次。*/如果是优先队列,并且标号最高的点优先的话,我们就得到了最高标号预流推进算法,其时间复杂度仅为(n2sqrt(m)),/*复杂度分析进行中……*/算是比较快的最大流算法了。

本条目对我有帮助0
MBA智库APP

扫一扫,下载MBA智库APP

分享到:
  如果您认为本条目还有待完善,需要补充新内容或修改错误内容,请编辑条目投诉举报

本条目由以下用户参与贡献

LuyinT.

评论(共0条)

提示:评论内容为网友针对条目"预流推进"展开的讨论,与本站观点立场无关。

发表评论请文明上网,理性发言并遵守有关规定。

打开APP

以上内容根据网友推荐自动排序生成

下载APP

闽公网安备 35020302032707号