「Note」图论方向 - 网络流
1. 网络流
1.1. 定义
1.1.1. 网络
网络是指一个有向图 \(G=(V,E)\),每条边 \((u,v)\in E\) 有一个权值,\(c(u,v)\) 称为容量,当 \((u,v)\notin E\) 时,有 \(c(u,v)=0\)。
特殊地,在图中有源点、汇点两点,分别为 \(s\in V,t\in V\)。
1.1.2. 流
设流函数 \(f(u,v)\to\R(u,v\in V)\) 表示由二元组 \((u,v)\) 向实数集 \(\R\) 的映射,我们称 \(f(u,v)\) 为边 \((u,v)\) 的流量。
流函数 \(f(u,v)\) 需满足以下性质:
- 容量限制:对于每条边,其流量不能超过其容量,即 \(f(u,v)\le c(u,v)\)。
- 斜对称性:相反两边流量和为 \(0\),即 \(f(u,v)=-f(v,u)\)。
- 流守恒性:从源点流出的流量等于流入汇点的流量,也可称除源汇点外所有点流入流出流量相等,即 \(\forall x\in V\land i\notin\{S,T\},\sum f(u,x)=\sum f(x,v)\)。
流函数完整定义:
\]
1.1.3. 其他定义
对于当前状态下的网络,定义源点流出的流量(流入汇点的流量)为网络此状态下(当前流)的流量。
对于边 \((u,v)\) 定义 \(C_f(u,v)\) 为此边容量与流量之差,表示此边的剩余流量,即 \(C_f(u,v)=c(u,v)-f(u,v)\)。
对于图 \(G\) 定义 \(G_f\) 为 \(G\) 中所有节点与剩余流量大于 \(0\) 的边构成的子图,表示残余网络,即 \(G_f=(V,E_f)\),其中 \(E_f=\{(u,v)|c_f(u,v)>0\}\)。
定义增广路 \(P\) 为残余网络 \(G_f\) 上从 \(s\) 到 \(t\) 的路径。
定义割,将点集 \(V\) 分为无交集的两集合 \(A,B\) 且 \(s\in A,t\in B\),这种点的划分方式称为割。定义割的容量为 \(\sum\limits_{u\in A} \sum\limits_{v\in B}c(u,v)\),割的流量为 \(\sum\limits_{u\in A} \sum\limits_{v\in B}f(u,v)\)。若边 \((u,v)\) 中 \(u,v\) 所属点集不同,称此边为一条割边。
1.2. 网络最大流(最小割)
进入正题,给定网络 \(G=(V,E)\) 与源汇,求此网络的最大流量。
1.2.1 最大流最小割定理
最大流等于最小割,证明如下。
对于每一单位的流量,设其经过割边 \((u,v)(u\in A,v\in B)\) 的次数为 \(\mathrm{to}\) 经过边 \((v,u)\) 的次数为 \(\mathrm{back}\)。一定有 \(\mathrm{to}=\mathrm{back}+1\),否则不可能从源点流至汇点。
可以得出流量等于割边流量不大于割边总容量,即割的容量。得出结论:
- 任意一组流的流量不大于一组割的流量。
当最大流存在时,此时残余网络一定无法增广,从而得到 \(s,t\) 不连通,残余网络也不连通,自然我们得到了一组割,此时最大流量等于割的容量。得出结论:
- 存在一组流的流量等于一组割的容量。
综上所述,可以得到最大流等于最小割。
1.2.2. 增广
采用贪心的思想对残余网络 \(G_f\) 进行增广,具体围绕以下两原则:
- 能流满就流满
- 不断寻找增广路
具体地,对于我们在 \(G_f\) 上找到的一条增广路 \(P\),根据能流满就流满的原则,我们令其增加流量 \(c_f(P)=\min\limits_{(u,v)\in P}c_f(u,v)\)。
为保证贪心的正确性,我们尝试加入反悔操作。将边 \((u,v)\) 的流量增加 \(c_f(P)\),可以理解成将边 \((u,v)\) 的剩余容量减少 \(c_f(P)\),我们在进行此操作的同时将反边 \((v,u)\) 的剩余容量减少 \(c_f(P)\),使得我们可以在接下来的操作中进行增广。所以对于每一条边来说我们维护的实际上是其剩余流量。
1.2.3 EK 算法
EK 并不是 EK 鲁比,而是 Edmonds-Karp。
采用 BFS 找一条长度最短增广路,再进行增广,就这样。
时间复杂度为 \(O(nm^2)\),证明详见 OI-Wiki。
1.2.4 Dinic 算法
对于网络用 BFS 进行分层,在 DFS 进行多路增广时只允许向下一层的点转移。这样将网络视为 DAG,规范增广路形态,避免了环的出现。
Dinic 算法的核心优化为当前弧优化。增广时,对于容量等于流量的边无需访问,不是每次遍历都需要从邻接表头进行枚举。我们记录一个第一条没有流满的边,从此进行遍历即可。
优化后的 Dinic 时间复杂度为 \(O(n^2m)\),证明详见 OI-Wiki,我实在是太懒了。
「Note」图论方向 - 网络流的更多相关文章
- 「NOTE」常系数齐次线性递推
要不是考到了,我还没发现这玩意我不是很会-- # 前置 多项式取模: 矩阵快速幂. # 常系数齐次线性递推 描述的是这么一个问题,给定数列 \(c_1,c_2,\dots,c_k\) 以及数列 \(f ...
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
- [LOJ#3022][网络流]「CQOI2017」老 C 的方块
题目传送门 定义有特殊边相邻的格子颜色为黑,否则为白 可以看出,题目给出的限制条件的本质是如果两个小方块所在的格子 \(x\) 和 \(y\) 为两个相邻的黑格,那么 \(x\) 和 \(y\) 之间 ...
- Note -「多项式」基础模板(FFT/NTT/多模 NTT)光速入门
进阶篇戳这里. 目录 何为「多项式」 基本概念 系数表示法 & 点值表示法 傅里叶(Fourier)变换 概述 前置知识 - 复数 单位根 快速傅里叶正变换(FFT) 快速傅里叶逆变换(I ...
- 「CF559E」 Gerald and Path
「CF559E」 Gerald and Path 为啥我现在做啥题都在想网络流啊 考虑 \(\texttt{DP}\). 容易想到状态应该包含当前枚举了前 \(i\) 条线段,且第 \(i\) 条线段 ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2013-9-5」Configure WingIDE for better display of East Asian Glyphs
很久没写软件配置相关的博客了.这次对于 WingIDE 在 Windows 下的字体配置,折腾了好一阵子,略曲折,也反映了「不清楚原理和背景的情况下,盲人摸象的效率低下是必然」这条放之四海而皆准的赤果 ...
- LOJ #2135. 「ZJOI2015」幻想乡战略游戏(点分树)
题意 给你一颗 \(n\) 个点的树,每个点的度数不超过 \(20\) ,有 \(q\) 次修改点权的操作. 需要动态维护带权重心,也就是找到一个点 \(v\) 使得 \(\displaystyle ...
- 「SCOI2016」围棋 解题报告
「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...
随机推荐
- pandas contains 函数
Series.str.contains( pat, # 要查询的字符串.要查询的或者正则表达式 case=True, # 是否对大小写敏感 flags=0, # 用来传给正则模块的参数,比如 flag ...
- nuxt,从开发到线上部署
起因: 前段时间,同组小伙伴使用vue做了一个小后台,使一位后端沉寂多年得求道之心又躁动了起来...然后,当我和这个躁动起来得后端要合作重构一个网站得时候,后端小哥哥说,就知道套页面,套页面,不用新技 ...
- Vue3生命周期钩子函数深度解析:从源码到实战的万字指南
一.Vue3生命周期革新特性 相较于Vue2,Vue3通过Composition API带来了更灵活的生命周期管理方式.通过onBeforeMount等函数注册钩子时,实际是通过injectHook方 ...
- Detected non-NVML platform: could not load NVML: libnvidia-ml.so.1: cannot open shared object
前言 在 kubernetes 中配置 https://github.com/NVIDIA/k8s-device-plugin 时, 报错:Detected non-NVML platform: co ...
- k8s Pod状态详解
k8s Pod状态详解 在 Kubernetes 中,Pod 是最小的可部署的计算单元,它是一组容器的集合,共享同一个网络命名空间.存储卷等资源. Kubernetes 中的 Pod 有以下几种状态: ...
- 【前端开发】记一次Echart 内存泄露问题的排查
最近发现一个web项目总是莫名其妙的内存增长,然后进行定位后来发现问题大概率出在Eharts上. 于是乎就开始搜索关于echarts内存增长的一些例子,但是都没有结果. 其中翻博客时发现甚至有人换成一 ...
- 内部类--成员内部类、静态内部类、局部内部类--java进阶day03
1.内部类 内部类分为4种,成员内部类用处不大,静态内部类和局部内部类更是鸡肋,唯有匿名内部类是需要我们重点掌握的 1.成员内部类 Inter类要访问Outer类的成员可以直接访问,而Outer要访问 ...
- 【C语言】gcc编译时报错 fatal error: stdio.h: 没有那个文件或目录
零.问题 在Ubuntu20.04.6中使用GCC编译一个HelloWorld代码时遇到如下问题: 首先确认了,自己单词没有拼写错. 然后再检查GCC的版本,确实没问题: 我用的是Ubuntu20.0 ...
- ubuntu 22.04安装docker
一.安装 更新软件包索引: sudo apt-get update 允许APT使用HTTPS: sudo apt-get install -y apt-transport-https ca-certi ...
- Unity3d中协程的原理,你要的yield return new xxx的真正理解之道