学了那么久网络流才发现自己不知道 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\),定义

\[S=\sum_p\min\{d^{in}_p,d^{out}_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\) 左右。

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

Dinic的几种复杂度的更多相关文章

  1. Mahout的taste里的几种相似度计算方法

    欧几里德相似度(Euclidean Distance) 最初用于计算欧几里德空间中两个点的距离,以两个用户x和y为例子,看成是n维空间的两个向量x和y,  xi表示用户x对itemi的喜好值,yi表示 ...

  2. 几种复杂度的斐波那契数列的Java实现

    一:斐波那契数列问题的起源 13世纪初期,意大利数论家Leonardo Fibonacci在他的著作Liber Abaci中提出了兔子的繁殖问题: 如果一开始有一对刚出生的兔子,兔子的长大需要一个月, ...

  3. HDU 3657 Game (SAP | Dinic | EK 三种算法的比较)

    Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. Dinic算法详解及实现

    预备知识: 残留网络:设有容量网络G(V,E)及其上的网络流f,G关于f的残留网络即为G(V',E'),其中G'的顶点集V'和G的顶点集V相同,即V'=V,对于G中任何一条弧<u,v>,如 ...

  5. 网络流(四)dinic算法

    传送门: 网络流(一)基础知识篇 网络流(二)最大流的增广路算法 网络流(三)最大流最小割定理 网络流(四)dinic算法 网络流(五)有上下限的最大流 网络流(六)最小费用最大流问题 转自:http ...

  6. loglikelihood ratio 相似度

    摘要: 在机器学习中常用到各种距离或者相似度,今天在看美团推荐系统重排序的文章时看到了loglikelihood ratio 相似度,特总结起来.以后有时间再把常用的相似度或者距离梳理到一篇文章. 背 ...

  7. Elasticsearch中的相似度模型(原文:Similarity in Elasticsearch)

    原文链接:https://www.elastic.co/blog/found-similarity-in-elasticsearch 原文 By Konrad Beiske 翻译 By 高家宝 译者按 ...

  8. 斯坦福大学公开课机器学习:machine learning system design | error metrics for skewed classes(偏斜类问题的定义以及针对偏斜类问题的评估度量值:查准率(precision)和召回率(recall))

    上篇文章提到了误差分析以及设定误差度量值的重要性.那就是设定某个实数来评估学习算法并衡量它的表现.有了算法的评估和误差度量值,有一件重要的事情要注意,就是使用一个合适的误差度量值,有时会对学习算法造成 ...

  9. dinic算法求最大流的学习

    http://trp.jlu.edu.cn/software/net/lssx/4/4.38.htm http://www.cnblogs.com/zen_chou/archive/0001/01/0 ...

  10. R和中心度、中心势

    最近用R画论文里的弦图,恰好借的书里着重写了中心度等问题. 网上流行一套密歇根大学社交计算的教程.但是前两年看了好几遍总是搞不清,即便是记公式也是收效不大.不妨按照书上总结一下. 绝对法: 无向图点度 ...

随机推荐

  1. JS学习-Web Workers API接口

    Web Workers API接口 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作.这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通 ...

  2. VUE学习-组件

    组件 组件是可复用的 Vue 实例,且带有一个名字. <div id="components-demo"> <button-counter></but ...

  3. 前端常见的Vue面试题目汇总

    请说一下响应式数据的原理 默认Vue在初始化数据时,会给data中的属性使用Object.defineProperty重新定义所有属性,当页面到对应属性时,会进行依赖收集(收集当前组件中的watche ...

  4. Echarts 设置Y轴 || X轴的刻度只显示整数

    目前的效果如下:(有小数) 想要的效果如下:(整数) 解决方案: 在配置项的yAxis或者xAxis对象中添加属性:minInterval: 1,表示将刻度的最小间距设置为1 注意: minInter ...

  5. JavaSE——this关键字

    this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题) 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量 方法的形参没有与成员变量同名,不带 ...

  6. Hello,Golang

    Hello,Golang 一.开发环境搭建 1. 下载 SDK 1 // Go官网下载地址 2 https://golang.org/dl/ 3 ​ 4 // Go官方镜像站(推荐) 5 https: ...

  7. Python 切片/列表/字符串之间装换

    1. 怎么实现字符串变为list 使用split(),把字符串拆分再存入数组: 例子 input="ni si shi" output=input.split(" &qu ...

  8. popen函数和pyinstaller打包之 -w冲突

    启发文章:https://www.jb51.net/article/184731.htm 之前我也是用到了os.popen()这个函数 1.os.popen(self.excel_path)  括号里 ...

  9. Kubernetes初识

    目录: 云原生 Kubernetes概述 1.K8S是什么 2.为什么要用K8S 3.Kubernetes集群架构与组件 K8S的特性 核心组件 Master组件 配置存储中心 Node组件 Kube ...

  10. Gtiee_上传本地项目

    Git_本地代码上传到码云 本文仅作学习记录,方便日后翻看 创建本地仓库 找到自己本地代码的文件夹,打开Git GUI Here,输入git init创建本地仓库,当前文件夹下有.git文件表示创建成 ...