【概述】

压入与重标记算法(Push-Relable Algorithms)又称预留推进算法,是 GoldBerg 与 Tarjan 共同发现的,时间复杂度为 O(V*V*E)

该算法与 EK 、Dinic 等增广路算法一样是用于求最大流的,不同于增广路算法检查整个残留网络来找出增广路径,该算法每次仅对一个顶点进行操作,并且检查残量网络中该点相邻的点。

【算法原理】

首先引入新名词的定义:

  • 余流:对于一个顶点,依旧存储在该点中,尚未排除的流量,记作:excess(u)= f(V,v)>=0
  • 活性点:对于一个不属于源点、汇点的任意点 v,若其容量有限且其余流大于 0,那么称该点为一活性点,且该点流量溢出
  • 点的高度:每个点 i 被赋予了一个高度 height(i),余流只能从高向下压入比他低的顶点
  • 合法标记:对于图中的任意一条边 (u,v),若满足 height(u)<=height(v)+1,那么具有一个合法标记,而仅当 height(u)=height(v)+1 时,才将流从 u 压入 v

假设每个顶点 u 存在无限大容量的水库,可以用来储存任意多的水,储存在该顶点的流量即为该点的余流

在开始时,令除 S、T 两点外的点的高度为 height(S)=|V|,height(T)=0 固定不变,其他点的高度 height(i) 初始化为 0,随着算法进行不断进行调整

令所有从源点 S 出来的边,达到饱和状态,成为饱和边,然后尽量使这个余流达到汇点 T,若是有一部分无法到达 T,那么将剩下的余流返回源点 S,当任意一点 u 的余流 excess(u)=0 时,算法停止,返回最大流

每个点与其关联的的点处于同一高度,当需要压入点 u 的流量时(Push(u) 操作),重标记点 u 的高度 height(u)(relabel(u) 操作),使得点 u 的余流流向高度小于他的点 v,直到存在一点的余流为 0

【实现】

int cap[N][N];  //容量网络
int flow[N][N]; //流量网络
int height[N];  //高度标记
int excess[N];  //余流
void push(int start, int end) {int newflow = min(excess[start], cap[start][end] - flow[start][end]);//改变当前流量flow[start][end] += newflow;flow[end][start] = -flow[start][end];//改变余流excess[start] -= newflow;excess[end] += newflow;
}bool reLabel(int S, int T, int index) { //重标记int minn = INF;                     //最小的高度for (int i = S; i <= T; i++)if (cap[index][i] - flow[index][i] > 0)minn = min(minn, height[i]);if (minn == INF)return false;height[index] = minn + 1; //满足height(u)=height(v)+1,标记下放for (int i = S; i <= T; i++) {if (excess[index] == 0) //余流为0,标记下放结束,返回truereturn true;if (height[i] == minn &&cap[index][i] > flow[index][i]) //处于同一高度,压入流量push(index, i);}return true;
}void pushReLabel(int S, int T) {//预处理余流for (int i = S; i <= T; i++) {if (cap[S][i] > 0) {int newflow = cap[S][i];flow[S][i] += newflow;flow[i][S] = -flow[S][i];excess[S] -= newflow;excess[i] += newflow;}}bool flag = true;while (true) {if (!flag)break;flag = false;for (int i = S; i <= T - 1; i++) {if (excess[i] > 0) { //当余流大于0时,继续重标记if (flag || reLabel(S, T, i))flag = true;}}}
}int main() {int n, m;while (scanf("%d%d", &n, &m) != EOF) {memset(cap, 0, sizeof(cap));memset(flow, 0, sizeof(flow));memset(height, 0, sizeof(height));memset(excess, 0, sizeof(excess));int S = 1, T = n;height[S] = n;height[T] = 0;for (int i = 1; i <= m; ++i) {int x, y, w;scanf("%d%d%d", &x, &y, &w);cap[x][y] = w;}pushReLabel(S, T);int res = excess[T]; //汇点的余流即最大流printf("%d\n", res);}return 0;
}

图论 —— 网络流 —— 最大流 —— 压入与重标记算法相关推荐

  1. 图论-网络流⑦-费用流解题

    图论-网络流⑦-费用流解题 上一篇:图论-网络流⑥-费用流 下一篇:图论-网络流⑧-有上下界的网络流 参考文献: https://www.luogu.com.cn/blog/user9012/solu ...

  2. 图论 —— 网络流 —— 费用流 —— zkw 费用流

    [概述] 求解费用流的方法很多,目前最流行的是 MCMF 费用流,其实质是将 EK 算法中的 bfs 换为了 SPFA 来计算最小费用,但其存在的一个缺点是 EK 是单路增广的,这样速度会相应的慢一些 ...

  3. 图论 —— 网络流 —— 费用流 —— 基于 Dijkstra 的费用流

    [概述] 在求解费用流时,大多数情况都是使用基于 SPFA 的 MCMF 算法,但有时某些毒瘤题会卡 SPFA,此时就要利用基于 Dijkstra 的费用流来求解. [算法原理] 基于 Dijkstr ...

  4. 图论 —— 网络流 —— 最大流 —— Dinic 算法

    [概述] Dinic 算法在 EK 算法的基础上进行了优化,其时间复杂度为 O(n*n*m). Dinic 在找增广路的时也是找最短增广路, 但与 EK 算法不同的是 Dinic 算法并不是每次 bf ...

  5. 图论--网络流--最大流 洛谷P4722(hlpp)

    题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...

  6. 图论 —— 网络流 —— 费用流 —— MCMF 算法

    [概述] EK 算法是每次用广搜寻找一条最短的增广路,然后沿其增广,而 MCMF 算法是在 EK 算法的基础上,每次用 SPFA 计算图的距离标号,然后沿着可行边进行增广,即将 EK 算法中的 bfs ...

  7. 图论 —— 网络流 —— 最大流 —— FF 算法与 EK 算法

    [概述] FF 算法与 EK 算法是求解最大流的一般增广路方法,其时间复杂度均为 O(n*m*m) Ford-Fulkerson 算法是求解最大流的最基础的算法,其核心思想是增广路定理:网络达到最大流 ...

  8. 网络流最大流初步-Push–relabel maximum flow algorithm

    简介 做网络流最大流的题,常用的算法就是Dinic's algorithm.时间复杂度为,通常由于出题人水平较低,几乎能过所有的题.功利地看,这样就没问题了.但是,站在追求真(zhuang)理(B)的 ...

  9. 【图论】网络流——最大流和最小费用流

    [图论]网络流--最大流和最小费用流 文章目录 [图论]网络流--最大流和最小费用流 1. 最大流问题 1.1 基本概念 1.2 寻求最大流的算法(Ford-Fulerson) 1.3 matlab求 ...

最新文章

  1. 解码大脑:改善BCI稳定性
  2. windows的几个原则
  3. sqli-labs过关笔记(Page-1:1-22关)
  4. apache apollo_Apache Apollo REST API
  5. Python pyenv
  6. 146. LRU 缓存机制
  7. 使用注解匹配Spring Aop切点表达式
  8. 【白皮书分享】2020新式茶饮白皮书:数字化进阶-奈雪.pdf(附下载链接)
  9. 乔布斯首份手写求职信再次被拍卖
  10. angularjs html编码,怎样使用AngularJS实现base64编码与解码
  11. 使用神经网络(Keras)完成对土壤的湿度估计
  12. c语言求最长单调子序列,设计一个O(n2)时间算法,找出由n个数组成的序列的最长单调递增子序列...
  13. 白帽黑客教主 TK 告诉你,黑客的游戏 CTF 究竟是什么 | 硬创公开课总结文+视频...
  14. 一键修改 PPT 所有页面的字体设置
  15. 计算机word如何提交,如何在word添加视频?
  16. 【MobaXterm教程】【公网】利用ipv6远程访问服务器
  17. Allwinner Camlinux的3g驱动移植
  18. WIN10系统CH340驱动预安装成功,但是设备显示器中的端口不能显示CH340驱动
  19. 黑白棋游戏源代码分析
  20. 学术文章绘图常用颜色搭配(附RGB值)

热门文章

  1. JavaEE实战班第十一天
  2. 为什么 Java 在 25 年之后依旧如此年轻:一个架构师的看法
  3. 任正非:华为有意出售 5G 技术!
  4. 当Typora开始收费,开源免费的MarkText编辑器火了:一周新增2k+star
  5. 这样的问题代码,我实习的时候都写不出来!
  6. Alibaba Sentinel 限流与熔断初探
  7. 温昱:架构实践全景图
  8. JEECG 页面多个用户选择器只显示最后一个
  9. 医疗影像技术简介(X射线,CT,MRI等)
  10. MySQL运维实战系列:MySQL5.7 Group By 问题