Dinic的几种复杂度

学了那么久网络流才发现自己不知道 Dinic 算法的一个在各边容量均为 1 的网络时复杂度上的结论。我说为啥学术社区那题优化建图复杂度是对的呢……

以下均认为使用了当前弧优化多路增广

以下认为 n 为点数,m 为边数,n=O(m)

以下考虑的复杂度均为 O(增广轮数×单轮增广复杂度),这个显然是一个合法上界。


一般网络:O(n2m)

对于一般网络,增广轮数显然为 O(n),因为每轮终点层数递增。

对于单轮增广复杂度,在不限制容量范围时,不会超过 O(nm):对于每个状态的当前弧,只会消耗 O(n) 的时间找到一组合法增广路;而当前弧状态数不会超过 O(m)

因此,对于一般网络,其复杂度为 O(n2m)


关于值域的增广轮数上界:O(pmin{dpin,dpout})

假设每个点 p 的出边容量和为 dpout,入边容量和为 dpin,定义

S=pmin{dpin,dpout}

则增广轮数不会超过 S

如果在 S 轮内已经结束,显然就是 O(S) 的。

假设已经经过了 S 轮,则到达汇点的增广路长度,也即在残量网络上的最短路长度,接下来不会低于 S

假设接下来几轮中我们还要流 d 条增广路,则由于除源汇外每个点最多属于 min{dpin,dpout} 条有流量的路径,在当前残量网络中存在一种取 d路径不是增广路)的方案。于是残量网络上起点到终点最短路O(Sd) 的。

于是,d=O(S),所以最多再流 O(S) 轮,增广轮数即为 O(S) 的。

因此增广轮数是 O(S) 的。


各边容量均为 1 的网络:O(mmin{m12,n23})

接下来我们考虑的是各边容量均为 1 的网络。

对于单轮增广复杂度,考虑到每条边会被访问不超过一次,单轮复杂度为 O(m) 的。

增广轮数是 O(m) 的:S=O(m)

增广轮数是 O(n23) 的:这个比较高明,推导比较复杂,咕了。

因此,对于各边容量均为 1 的网络,其复杂度为 O(mmin{m12,n23})


单位网络:O(mn)

单位网络是一类特殊的各边容量均为 1 的网络,满足除源汇外各点入度不超过 1 或出度不超过 1

显然单轮增广复杂度还是 O(m) 的。

考虑增广轮数,S=O(n),因此增广轮数是 O(n) 的。

因此,对于单位网络,其复杂度为 O(mn)


在稀疏图、稠密图上的分析

稀疏图(mn 稠密图(mn2
一般网络 O(n3) O(n4)
各边容量均为 1 的网络 O(nn) O(n83)
单位网络 O(nn) O(n52)

在稀疏图上,各边容量均为 1 的网络的效率比较明显,n 可以取到 2×105 左右。

在稠密图上,三者的差异就更大了。(不过复杂度一般卡不满)

posted @   myee  阅读(1752)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
点击右上角即可分享
微信分享提示