首页 > 编程语言 >算法学习笔记(8.2): 上下界网络流

算法学习笔记(8.2): 上下界网络流

时间:2023-01-14 22:14:01浏览次数:69  
标签:8.2 差界 源点 网络 流量 下界 算法 汇点

上下界网络流

目录

前置知识以及更多芝士参考下述链接
网络流合集链接:网络流

上下界网络流是普通网络流的一种变体,对于网络流,我们不仅关注其流量的上界,下届同样有所体现。
题型大致有五种

  • 有源汇
  • 无源汇
  • 可行流
  • 最大流
  • 最小流

虽然听着挺唬人的……其实理解了也非常简单


无源汇可行流

这是上下界网络流的基础,也是最简单的一种

给定一个没有源点和汇点,每条边有上下界的流量网络,目的是求有没有一种可能的流使得流量守恒

流量守恒:每一个点流入和流出的量相等


考虑这样一个图

我们先画出两个图

稍后解释是什么,以及有什么用

下界网络:

以及差界网络:

我们根据原图原图结构构造出了两张图

下界网络每一条边对应着流量下界,差界网络的每一条边容量对应着原图流量上下界的差

我们希望两个网络流相加之后恰好是原图的一种可行流,这首先要求下界网络是满流的(可行流至少必须达到下界)

但是考虑到流量守恒,我们需要对下界网络上不平衡的结点在差界网络上进行处理

首先我们在下界网络中新建一个虚拟源点 \(S'\) 和虚拟汇点 \(T'\)

本文中虚拟的点都以 \('\) 结尾

接着考虑在下界网络中的一个点 \(x\), 我们假设其流入流量为 \(in(x)\), 流出流量为 \(out(x)\)

那么一共会出现三种情况:

  • \(in(x) \gt out(x)\) 即流入大于流出。那么在差界网络中,我们需要补齐多流入的部分。那么我们通过虚拟源点向点 \(x\) 连一条容量为 \(in(x) - out(x)\) 的边。

  • \(in(x) = out(x)\) 即流入等于流出,此时不需要处理

  • \(in(x) \lt out(x)\) 即流入小于流出,那么在差界网络中,我们需要补齐多流出的部分,所以,\(x\) 向虚拟汇点连一条容量为 \(out(x) - in(x)\) 边

通过上述处理之后,差界图就变为了:

左图为处理过的差界网络,右图为下界网络

在保证了下界网络的流量守恒之后,我们在修改过的差界网络上从 \(S'\) 到 \(T'\) 跑一次最大流,把每一条在原图上的边的流量加回到下界网络中,就是获得了一种可行流

但是,总归是有不可行的时候:如果我们新建的附加边没有达到满流状态,表明在差网络没有办法补齐下界网络中的不守恒,也就是说,原网络中不存在可行流。

在实际中,我们并不需要建立下界网络,只需要对于查网络进行处理即可

在最后判断的时候只需要判断所有关于源点的附加边是否满流,或者所有关于汇点的附加边即可

有源汇上下界可行流

思考一下,在有源汇的网络流中,流是如何”流动“的

很明显,是从源点到汇点

也就是说,源点吐出流量,汇点吃到流量,且源点吐出和汇点吃掉的流量一定一是一样

那么考虑我们如何将流量恒定的留在网络中?

很明显,我们把汇点吃掉的流量流回源点即可

换句话来说,我们只需要在实际汇点 \(T\) 到源点 \(S\) 连接一条流量为 \(INF\) 的边就行了

如此处理之后,我们就把源点和汇点处理成网络中的一般点

接着我们就只需要把它与一般的无源汇图进行一样的处理即可

如何寻找可行流流量?

由于我们将源点的流量流回了汇点,所以实际流量就是我们新建的从汇点到源点的边上的流量

处理之后大致是这样的

有源汇上下界最大流

考虑我们在处理后的图中得到了一个可行流,但是从实际源点与实际汇点间还可能有额外的流量

注意一下,下面是在跑完第一次最大流的剩余网络的基础上进行操作

最小流亦是

所以我们把在差界网络新建的所有额外边的流量设为 \(0\)(相当于删除这些边)然后再从 \(S\) 到 \(T\) 跑一次最大流即可

形象一点,我们在跑 \(S'\) 到 \(T'\) 的最大流时并不一定榨干了 \(S\) 到 \(T\) 的剩余流量,所以还需要再榨一次 \gou

那么此时原网络的最大流即是两次跑最大流的流量和

模板题:Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流 - 洛谷

NOTICE: 在这种稠密图上跑最大流,还是必要当前弧优化的,不然会死的很惨……

有源汇上下界最小流

与最大流类似,但是不是榨干了,是把榨了的还回去 有种心虚的感觉

所以,同样处理所有新建的额外边,但是这次是从 \(T\) 到 \(S\) 跑一次最大流

可以看作把流量流回去

此时原网络的最小流即是两次最大流的流量差

作者有话说

如果我们在求最大或者最小流的时候采用的是ISAP算法,那么千万要记住,在删除边之后需要更改源点汇点重新跑一次BFS更新深度(其实不更新也没大问题,反正错了也不给钱是吧 _

标签:8.2,差界,源点,网络,流量,下界,算法,汇点
From: https://www.cnblogs.com/jeefy/p/17052650.html

相关文章

  • 基于CEM算法的三维人脸模型贴图matlab仿真
    1.算法描述采用三维人脸贴图算法conformalenergyminimization,将二维图片贴到三维人脸模型中。2.仿真效果预览matlab2022a仿真结果如下:3.MATLAB部分代码预览clear;c......
  • 基于CEM算法的三维人脸模型贴图matlab仿真
    1.算法描述采用三维人脸贴图算法conformalenergyminimization,将二维图片贴到三维人脸模型中。 2.仿真效果预览matlab2022a仿真结果如下: 3.MATLAB部分代码预览......
  • C++算法日记_1A
    题目链接:https://ac.nowcoder.com/acm/contest/19859/A题目来源:牛客网题目描述请统计某个给定范围[L,R]的所有整数中,数字2出现的次数。比如......
  • 如何用Python参加算法竞赛
    如何用Python参加算法竞赛前言本文适合有一定c++基础且初步了解Python,并想开发自己第二竞赛用语言的人群阅读。本文仅介绍Python3,更低版本Python请自行了解。Python的......
  • 一、数据结构和算法概述
    本系列笔记全部来源了《2020最新数据结构与算法教程》,点击视频连接即可跳转观看学习。如有侵权,请联系删除,谢谢。1.1什么是数据结构?官方解释:数据结构是一门研究非数值......
  • 梯度下降算法 Gradient Descent
    梯度下降算法GradientDescent梯度下降算法是一种被广泛使用的优化算法。在读论文的时候碰到了一种参数优化问题:在函数\(F\)中有若干参数是不确定的,已知\(n\)组训练数......
  • 代码随想录算法训练营第18天
    今日刷题5道:513.找树左下角的值,112.路径总和,113.路径总和ii,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树● 513.找树左下角的值......
  • 算法--2023.1.14
    1.力扣435--无重叠区间classSolution{publicinteraseOverlapIntervals(int[][]intervals){Arrays.sort(intervals,(o1,o2)->(o1[1]-o2[1]));......
  • 每日算法之搜索插入位置
    35.搜索插入位置题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复......
  • 回溯算法
    目录组合基本回溯优化(剪枝)电话号码的字母组合组合总和(难)组合总和Ⅱ全排列全排列Ⅱ子集子集Ⅱ(难)递增子序列总结组合77.组合-力扣(LeetCode)基本回溯要把问题转换成......