迪尼茨算法

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

历史 
叶菲姆·迪尼茨在Adel'son-Vel'sky（AVL树的发明者之一）的算法课的课前活动上发明了这个算法。当时他不知道关于福特-富尔克森算法的基本事实。

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

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

定义
设为一个每条边的容量为，流为的网络。

残留容量的定义为：
 如果,
 
 
 否则。

则残留网络为，其中
 .

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

定义为中从源点到点的最短距离。那么的高度标号为，其中
 .

设图，其中不包含从到的路径，则阻塞流为一条从到的流。

算法
迪尼茨算法
 输入:网络。
 输出:的流的最大值。
 对每条边，设。
 在图的残留网络中计算。如果停止程序并输出.
 在找到一条阻塞流。
 将增加并返回第二步。

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

使用一种叫做动态树的数据结构，找到阻塞流的时间复杂度可以降到，此时迪尼茨算法的复杂度可以降到.

特殊情况 
在具有单位容量的网络中，迪尼茨算法可以在更短的时间内输出结果。每条阻塞流可以在的时间内构建，并且阶段（phases）的数量不超过或。此时算法的复杂度为。

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

参考文献

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

图算法
網絡流