一般图
复杂度主要取决于dfs增广的过程。
将dfs部分的复杂度分成两部分来分析:1)修改增广路上边的流量。至多会增广 m m m次,一条增广路的长度至多是 n n n,所以这一部分的复杂度是 O ( n m ) O(nm) O(nm)。2)dfs遍历时找增广路失败时经过的边。由于一旦从某条边出发找最短路失败了,我们就不会再走那条边(当前弧优化),所以这一部分的复杂度是 O ( m ) O(m) O(m)的。故而dfs增广的复杂度是 O ( n m ) O(nm) O(nm)。
而由于每一次重新建分层图,残余网络上 s s s到 t t t的最短路长度一定会增加,所以至多重建 n − 1 n-1 n−1次图。
故dinic的运行时间上界为 O ( n 2 m ) O(n^2m) O(n2m)。
单位图 (unit graph)
定义
单位图(unit graph) 是指,所有的边的容量都是整数,且每一个不是 s s s或 t t t的点,要么出度为 1 1 1,连出去的边容量为 1 1 1,要么入度为 1 1 1,连进来的边容量为 1 1 1。
复杂度分析
在单位图上,至多进行 2 ⌈ n − 2 ⌉ 2\lceil \sqrt {n-2}\rceil 2⌈n−2⌉次dfs增广。
考虑某一次dfs增广时,现在已经得到了的流为 f f f,最大流为 f ∗ f^* f∗, R R R为 f f f的残留网络。则 f ∗ − f f^* - f f∗−f是 R R R上的一个流,并且 R R R是单位图。我们必然可以将 f ∗ − f f^* - f f∗−f上容量为 1 1 1的边划分成 ∣ f ∗ ∣ − ∣ f ∣ |f^*| - |f| ∣f∗∣−∣f∣条从 s s s到 t t t的路径(可能还有一些环)。由于 R R R是单位图,所以除了 s , t s,t s,t以外的任意一个点至多属于一条路径,所以最短路径的长度至多为 n − 2 ∣ f ∗ ∣ − ∣ f ∣ + 1 {n-2\over |f^*|-|f|} + 1 ∣f∗∣−∣f∣n−2+1。
经过 ⌈ n − 2 ⌉ \lceil\sqrt {n-2}\rceil ⌈n−2⌉次dfs增广之后,最短路的长度至少