迪尼茨算法

迪尼茨算法()是在网络流计算最大流的强多项式复杂度的算法,设想由以色列计算机科学家在1970年提出。算法O(V^2 E)的时间复杂度类似于埃德蒙兹-卡普算法,其时间复杂度为O(VE^2),迪尼茨算法与埃德蒙兹-卡普算法的不同之处在于它每轮算法都选择最短的可行路径进行增广。迪尼茨算法中采用高度标号(level graph)以及阻塞流(blocking flow)实现性能。

历史
迪尼茨在格奧爾吉·阿傑爾松-韋利斯基(AVL树的发明者之一)的算法课的课前活动上发明了这个算法。当时他不知道关于福特-富尔克森算法的基本事实。

迪尼茨在1969年一月向他人公布了他发明的算法,又在1970年将其发布在《Doklady Akademii nauk SSSR杂志》。在1974年,希蒙·埃文和(他之后的博士学生)Alon Itai在海法的以色列理工学院对迪尼茨的算法以及亚历山大·卡尔扎诺夫的阻塞流的想法很感兴趣。但是杂志上的文章每篇的篇幅被限制在四页以内,很多细节都被忽略,这导致他们很难根据文章还原出算法。但他们没有放弃,在后三天不断地努力,设法了解这两个文件中的分层网络的维护问题。在接下来的几年,Even由于在讲学中将Dinitz念为Dinic,导致Dinic算法反而成为了它的名称。埃文和Itai也将算法与BFS和DFS结合起来,形成了当前版本的算法。

在福特-富尔克森算法发明后约十年之内,是否有算法能在多项式复杂度之内处理無理數邊權是未知的。这造成缺乏任何已知的多项式复杂度算法解决最大流问题。 迪尼茨算法和埃德蒙兹-卡普算法在1972年发布,证明在福特-富尔克森算法中,如果每次总选择最短的一条增广路,路径长度将单调增加,且算法总能终止。

定义
设G = ((V,E),c,s,t)为一个每条边的容量为c(u,v),流为f(u,v)的网络。

:残留容量c_f\colon V\times V \to R^+的定义为:
:# 如果(u,v)\in E,
:#: c_f(u,v) = c(u,v) - f(u,v)
:#: c_f(v,u) = f(u,v)
:# 否则c_f(u,v) = 0。

:则残留网络为G_f = ((V, E_f), c_f|_{E_f}, s, t),其中
:: E_f = \{(u,v)\in V \times V : c_f(u,v) > 0\}.

:增广路指通过残留网络G_f的从源点s到汇点t的一条有效路径。

:定义\operatorname{dist}(v)为G_f中从源点s到点v的最短距离。那么G_f的高度标号为G_L = (V, E_L, c_f|_{E_L}, s,t),其中
:: E_L = \{(u,v)\in E_f : \operatorname{dist}(v) = \operatorname{dist}(u) + 1\}.

:设图G' = (V,E_L', s, t),其中E_L' = \{(u,v) : f(u,v) 不包含从s到t的路径,则阻塞流为一条从s到t的流f。

算法
迪尼茨算法
: 输入:网络G = ((V, E), c, s, t)。
: 输出:s-t的流f的最大值。

对每条边e\in E,设f(e) = 0。

在图G的残留网络G_f中计算G_L。如果\operatorname{dist}(t) = \infty停止程序并输出f.

在G_L找到一条阻塞流f\;'。

将\ f增加f\;'并返回第二步。

分析
可以证明每轮算法中找到的阻塞流的边数至少增加1,因此整个网络中最多有n-1条阻塞流, n为网络中顶点的数量。高度标号G_L可以在O(E)的时间复杂度内用BFS构建,一条阻塞流可以在O(VE)的复杂度内构建。因此,算法的时间复杂度为O(V^2 E).

使用一种叫做动态树的数据结构,找到阻塞流的时间复杂度可以降到O(E \log V),此时迪尼茨算法的复杂度可以降到O(VE \log V).

特殊情况
在具有单位容量的网络中,迪尼茨算法可以在更短的时间内输出结果。每条阻塞流可以在O(E)的时间内构建,并且阶段(phases)的数量不超过O(\sqrt{E})或O(V^{2/3})。此时算法的复杂度为O(\min\{V^{2/3}, E^{1/2}\}E)。

在二分图匹配问题的网络中,阶段的数量不超过O(\sqrt{V}),算法的时间复杂度不超过O(\sqrt{V} E)。这种算法又叫霍普克罗夫特-卡普算法。同樣的上界也適用於更一般情況,即unit网络——网络中除源點及匯點外的頂點,都僅有一條容量為1的外向邊,或是僅有一條容量為1的內向邊,并且所有的容量限制都是整数。

参考文献
*

参见
*网络流
*福特-富尔克森算法

评论 (0)

  • 还没有评论,来抢沙发吧。