Dinic的几种复杂度
学了那么久网络流才发现自己不知道 Dinic 算法的一个在各边容量均为 \(1\) 的网络时复杂度上的结论。我说为啥学术社区那题优化建图复杂度是对的呢……
以下均认为使用了当前弧优化与多路增广。
以下认为 \(n\) 为点数,\(m\) 为边数,\(n=O(m)\)。
以下考虑的复杂度均为 \(O(\text{增广轮数}\times\text{单轮增广复杂度})\),这个显然是一个合法上界。
一般网络:\(O(n^2m)\)
对于一般网络,增广轮数显然为 \(O(n)\),因为每轮终点层数递增。
对于单轮增广复杂度,在不限制容量范围时,不会超过 \(O(nm)\):对于每个状态的当前弧,只会消耗 \(O(n)\) 的时间找到一组合法增广路;而当前弧状态数不会超过 \(O(m)\)。
因此,对于一般网络,其复杂度为 \(O(n^2m)\)。
关于值域的增广轮数上界:\(O(\sqrt{\sum_p\min\{d^{in}_p,d^{out}_p\}})\)
假设每个点 \(p\) 的出边容量和为 \(d^{out}_p\),入边容量和为 \(d^{in}_p\),定义
则增广轮数不会超过 \(\sqrt S\)。
如果在 \(\sqrt S\) 轮内已经结束,显然就是 \(O(\sqrt S)\) 的。
假设已经经过了 \(\sqrt S\) 轮,则到达汇点的增广路长度,也即在残量网络上的最短路长度,接下来不会低于 \(\sqrt S\)。
假设接下来几轮中我们还要流 \(d\) 条增广路,则由于除源汇外每个点最多属于 \(\min\{d^{in}_p,d^{out}_p\}\) 条有流量的路径,在当前残量网络中存在一种取 \(d\) 条路径(不是增广路)的方案。于是残量网络上起点到终点最短路为 \(O(\frac Sd)\) 的。
于是,\(d=O(\sqrt S)\),所以最多再流 \(O(\sqrt S)\) 轮,增广轮数即为 \(O(\sqrt S)\) 的。
因此增广轮数是 \(O(\sqrt S)\) 的。
各边容量均为 \(1\) 的网络:\(O(m\min\{m^{\frac12},n^{\frac23}\})\)
接下来我们考虑的是各边容量均为 \(1\) 的网络。
对于单轮增广复杂度,考虑到每条边会被访问不超过一次,单轮复杂度为 \(O(m)\) 的。
增广轮数是 \(O(\sqrt m)\) 的:\(S=O(m)\)。
增广轮数是 \(O(n^{\frac23})\) 的:这个比较高明,推导比较复杂,咕了。
因此,对于各边容量均为 \(1\) 的网络,其复杂度为 \(O(m\min\{m^{\frac12},n^{\frac23}\})\)。
单位网络:\(O(m\sqrt n)\)
单位网络是一类特殊的各边容量均为 \(1\) 的网络,满足除源汇外各点入度不超过 \(1\) 或出度不超过 \(1\)。
显然单轮增广复杂度还是 \(O(m)\) 的。
考虑增广轮数,\(S=O(n)\),因此增广轮数是 \(O(\sqrt n)\) 的。
因此,对于单位网络,其复杂度为 \(O(m\sqrt n)\)。
在稀疏图、稠密图上的分析
稀疏图(\(m\sim n\)) | 稠密图(\(m\sim n^2\)) | |
---|---|---|
一般网络 | \(O(n^3)\) | \(O(n^4)\) |
各边容量均为 \(1\) 的网络 | \(O(n\sqrt n)\) | \(O(n^{\frac83})\) |
单位网络 | \(O(n\sqrt n)\) | \(O(n^{\frac52})\) |
在稀疏图上,各边容量均为 \(1\) 的网络的效率比较明显,\(n\) 可以取到 \(2\times10^5\) 左右。
在稠密图上,三者的差异就更大了。(不过复杂度一般卡不满)
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/dinic-algorithm.html