首页 > 其他分享 >Dinic的几种复杂度

Dinic的几种复杂度

时间:2023-01-07 14:55:06浏览次数:36  
标签:增广 复杂度 网络 sqrt 几种 轮数 各边 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)\)。


各边容量均为 \(1\) 的网络:\(O(m\min\{m^{\frac12},n^{\frac23}\})\)

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

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

增广轮数是 \(O(\sqrt m)\) 的:这个与单位网络的证明类似,下面会提到。

增广轮数是 \(O(n^{\frac23})\) 的:这个比较高明,推导比较复杂,咕了。

因此,对于各边容量均为 \(1\) 的网络,其复杂度为 \(O(m\min\{m^{\frac12},n^{\frac23}\})\)。


单位网络:\(O(m\sqrt n)\)

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

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

考虑增广轮数。

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

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

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

因此,\(d=O(\sqrt n)\),于是接下来最多再进行 \(d\) 轮增广。

因此增广轮数是 \(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\) 左右。

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

标签:增广,复杂度,网络,sqrt,几种,轮数,各边,Dinic
From: https://www.cnblogs.com/myee/p/dinic-algorithm.html

相关文章

  • Android 数据传递的几种方式,HttpLoggingInterceptor消息拦截器
    目录​​Android数据传递的几种方式​​​​一。用intent传递​​​​二。使用bundle进行传值:​​​​三。当antivity销毁时传递数据StartActivityForResult​​​​HttpLo......
  • 解决java.lang.NullPointerException报错以及分析出现的几种原因
    1、字符串变量未初始化2、接口类型的对象没有用具体的类初始化,比如:Mapmap//会报错Mapmap=newMap();//则不会报错了3、当一个对象的值为空时,你没有判断为空的情......
  • 释放资源的几种方法总结
    1、BitmapData对象中的dispose()方法.2、ByteArray对象中的clear()方法。3、Loader对象中的unloadAndStop()方法。4、System对象中的gc()和​​disposeXML()方法​​。......
  • 关于算法复杂度的分析
    Hello,各位看官好,今天我们来说一个问题,就是如何计算算法复杂度(这里所说的算法复杂度就是时间复杂度)。    一、时间复杂度的概念二、计算时间复杂度的原理以及......
  • 几种简易测地球周长或半径的方法
       在学万有引力定律的时候,我们一直感叹在那个还没有精确仪器的年代,古人居然已经凭借观测和几何就已经测出了地球的半径、月地距离、日地距离,这是多么了不起的成就和......
  • php发送get、post请求的几种方法
    ​方法1:用file_get_contents以get方式获取内容 <?php$url='http://www.domain.com/';$html=file_get_contents($url);echo$html;?>  方法2:用fopen......
  • java中for 的几种常见用法
    J2SE1.5提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。本文介绍使用这种循环的具体方式,说明如何自行定义能被......
  • 网页中嵌入swf文件的几种方法
    1.object+embed      传统的方法优点:浏览器兼容性好,是Macromedia一直以来的官方方法缺点:a.embed标签是不符合W3C的规范的,无法通过验证。当然,如果你不在乎什......
  • 神经网络模型复杂度分析
    前言一,模型计算量分析卷积层FLOPs计算全连接层的FLOPs计算二,模型参数量分析卷积层参数量BN层参数量全连接层参数量三,模型内存访问代价计算卷积层MAC......
  • 透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。
    1、粘包与半包啥也不说了,直接上代码是不是有点不太友好,我所谓了,都快过年了,还要啥自行车我上来就是一段代码猛如虎1.1服务器代码publicclassStudyServer{static......