【网络流补全计划】Part.Ⅲ有上下界的网络流

本来心情就非常糟糕调月下毛景树把我最后一点写代码的心情调没了

放弃

开始补全网络流.

之前学了普通最大流,那么现在开始补有上下界的网络流.

在普通最大流中,网络里的每一条边都只有流量的上界即边的容量,而引入上下界网络流之后,每个边不但有一个容量,还有一个流量下界.

我们令B(u,v)表示边(u,v)的下界.于是我们可以有表达式:

B(u,v)≤f(u,v)≤C(u,v)

有这个式子可以得到

0≤f(u,v)≤C(u,v)?B(u,v)

至此,我们可以将有上下界的网络流分为几种问题来对待,接下来就分别讨论一下这几种问题.

(以下内容为我阅读2004国家集训队论文《一种简易的方法求解流量有上下界的网络中网络流问题》周源 以及网上的一些文章后总结归纳写出)

Problem.No.1无源汇有上下界的可行流

假设我们现在有一个网络G,但是网络中不存在源点和汇点S,T,但我们要求网络中的任意一个点i要满足流量平衡条件:

∑(u,i)∈Ef(u,i)= ∑(i,v)∈Ef(i,v)

也就是说让我们在给定有上下界的流网络中寻找可行流.

我们令 f(u,v)=B(u,v)+g(u,v)|g(u,v)≥0这样我们就可以保证每条边中的流量一定时刻符合流量下界的要求.

我们将每条边的容量C(u,v)修改一下,变为C′(u,v)=C(u,v)?B(u,v),这样就可以将已知网络转化为一个没有下界只有上界的流网络,上面的g(u,v)也就可以近似的看成一个可行流.

既然我们有∑(u,i)∈Ef(u,i)= ∑(i,v)∈Ef(i,v),f(u,v)=B(u,v)+g(u,v)|g(u,v)≥0那么就可以顺理成章的推理下去

∴∑(u,i)∈E[B(u,i)+g(u,i)]=∑(i,v)∈E[B(i,v)+g(i,v)]

∴∑(i,v)∈Eg(i,v)?∑(u,i)∈Eg(u,i)=∑(i,v)∈EB(i,v)?∑(u,i)∈EB(u,i)

我们设M(i)为流入i的下界和减去流出i的下界和

即为 M(i)=∑(i,v)∈EB(i,v)?∑(u,i)∈EB(u,i)

①若M(i)≥0

则∑(i,v)∈Eg(i,v)=[∑(u,i)∈Eg(u,i)]+M(i)

加入虚拟源点S0,则令C′(S0,i)=M(i)

②若M(i)<0

则∑(u,i)∈Eg(u,i)=[∑(i,v)∈Eg(i,v)]?M(i)

加入虚拟汇点T0,令C′(i,T0)=?M(i)(?M(i)>0).

在我们重新构图的网络中,如果所有g(S0,i)或者g(i,T0)都满载了,则此时g对应原图中的一个可行流f.

因此若要在原网络中寻找一个可行流,我们只需要在修改后的网络中寻找最大流,若最大流能够使得从源点流出的弧满流,那么原图中一定存在可行流,反之不存在.

Problem.No.2有源汇有上下界的可行流

对于这种情况,我们在源点和汇点之间单独连一条边,要求新连的边不存在下界和上界(即下界为0上界为MAXINT).这样原图变成了如同问题1一样的无源汇有上下界的可行流问题.修改图之后,我们所求的流即为从汇点流向源点的流.

Problem.No.3有源汇有上下界的最大流

法1

我们假设原图中存在源点S到汇点T的可行流f,f(u,v)=a,那么我们在汇点T和源点S之间添加一条弧,弧的流量下界B(t,s)=a,弧不存在流量上界,很显然现在的网络中存在可行流,且当前网络是无源汇的.(也就是转化成了Problem2)

我们二分a的值,每次都做一遍最大流,找到最大的amax,使得当前网络在问题2中存在解,则amax即为所求的最大流.

法2

我们在原图的汇点T和源点S间连一条弧,不存在上下界(即下界为0上界为MAXINT),使得原图变成无源汇的网络,再按照Problem1的方法,建立虚拟源点S0汇点T0,做S0→T0的可行流.若存在可行流f1,再拆掉添加的边,做一遍原图中源点到汇点的最大流f2.

由于第一次最大流中求得的f1只是所有满足下界的流量,在残留网络G(S,T)中仍然存在一些自由流(没有和超级源点和超级汇点连接的边)未满,因此最终答案ans=f1+f2

Problem.No.4有源汇有上下界的最小流

法1

与Problem3相似做法二分a,只是我们需要二分的不再是下界a,这里的a变成了上界C(T,S).找到最小的a,就是答案.

法2

也是与Problem3类似,增加虚拟源点汇点,在不添加边的情况下做S0→T0的最大流.而在做完后,再添加从原来的源点和汇点之间的那条边E(T,S)(同样无上界和下界),再次做S0→T0的最大流.若此时从S0流出的边满流,则f(T,S)为所求最小流,否则无解.

结合两个人博客的理解来阐述一下上面的法2:

和求3.有源汇的上下界最大流过程相反,感性理解是:

首先明确,我们的方法是通过加边转化成对任一点都有流量平衡的无源汇的网络,进行求解.

即最终解只能是加上边后,求的无源汇可行流,即T->S这边上的流量. 不改成无源汇的直接求的解是未必正确的,在(1)中已经提到.

然后,因为第一遍做的时候并无这条边,所以S->T的流量在第一遍做的时候都已经尽力往其他边流了. 于是加上T->S这条边后,都是些剩余的流不到其他边的流量. 从而达到尽可能减少T->S这边上的流量的效果,即减小了最终答案.

感觉上第一遍做的既然是不改成无源汇直接求的,应该是错误的?

这里不是错误的. 首先我们的解都是按照第二遍所求的而定,其次这里这样做本质是延迟对T->S这条边的增流.

Dmute

解决方法:先不增加d->s容量为无穷的边,进行一次maxflow(),如果还没有满流,则加一条(d,s)容量为无穷的边,再进行一次maxflow(),当且仅当所有附加弧满载时,有可行解,解为flow[(d->s)^1](即d到s的后悔边权值)。

Mr.Ant

事实上对我来说,我觉得在问题三四中法2更好一些,不仅比较好实现(只需要一次次重复调用已有的maxflow()函数),而且应该比法1好调一些(毕竟有个二分我这么沙茶很容易写残啊)

以及再次感谢 2004国家集训队论文《一种简易的方法求解流量有上下界的网络中网络流问题》周源和网上的那些博客.

时间: 2024-10-14 00:21:11

【网络流补全计划】Part.Ⅲ有上下界的网络流的相关文章

有上下界的网络流2-有源汇带上下界网络流ZOJ3229

ZOJ3229题目大意:一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝可以和C个女神拍照,每天拍照数不能超过D张,而且给每个女神i拍照有数量限制[Li,Ri],对于每个女神n天的拍照总和不能少于Gi,如果有解求屌丝最多能拍多少张照,并求每天给对应女神拍多少张照:否则输出-1. 解题思路:        1.增设一源点st,汇点sd,st到第i天连一条上界为Di下界为0的边,每个女神到汇点连一条下界为Gi上界为正无穷的边,对于每一天,当天到第i个女孩连一条[Li,Ri]的边.        2.

专题补全计划

专题补全计划 概述 时间: 寒假+大三下学期 要求: 1.每一类型的专题都要有专门的总结贴,有新的体会应该去更新总结贴. 2.大量做题和总结,及时复习,整理模板. 3.适当与外界交流,必要时需要完善训练计划. 4.持之以恒! 模板链接:(待完善) https://github.com/Wowkiee/ACM-ICPC/tree/master/template 知识点(待完善) 数据结构 ST表 线段树 主席树 动态规划 动态规划 区间dp 图论 最短路 最小生成树 网络流 联通分量 数学 pol

BZOJ 2406 二分+有上下界的网络流判定

思路: 求出每行的和  sum_row 每列的和   sum_line 二分最后的答案mid S->i  流量[sum_row[i]-mid,sum_row[i]+mid] i->n+j 流量[L,R] n+j->T 流量 [sum_line[i]-mid,sum_line[i]+mid] 套用有上下界的网络流 判一下就好了.. 这是道有上下界网络流的裸题 //By SiriusRen #include <queue> #include <cstdio> #inc

有上下界的网络流1-无源汇带上下界网络流SGU194

今天开始啃网络流了.对于求解无源汇带上下界的网络流,我们可以这样建图:建图模型:         以前写的最大流默认的下界为0,而这里的下界却不为0,所以我们要进行再构造让每条边的下界为0,这样做是为了方便处理.对于每根管子有一个上界容量up和一个下界容量low,我们让这根管子的容量下界变为0,上界为up-low.可是这样做了的话流量就不守恒了,为了再次满足流量守恒,即每个节点"入流=出流",我们增设一个超级源点st和一个超级终点sd.我们开设一个数组du[]来记录每个节点的流量情况.

poj_2396 有上下界的网络流

题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] < 4, a[3][3] = 10等等,且要求矩阵中的每个元素值非负.求出,是否存在满足所有给出的限制条件的矩阵,若存在输出. 题目分析 这么多限制条件..开始只能想到暴力解法+剪枝.这他妈得需要多大的脑洞才能无中生有的想到网络流解法? 不过,给出网络流的想法之后发现采用网络流解法确实很合理,很简单(唯

ZOJ 2314 Reactor Cooling 带上下界的网络流

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li. 求的是最大流. 很久之前就看了带上下界的网络流,一直没看懂

SGU 194. Reactor Cooling(无源汇有上下界的网络流)

时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 */ #include <iostream> #include <cstring> #define ms(a,b) memset(a,b,sizeof a) using namespace std; const int MAXN = 209; struct node { int u, v

ZOJ 2314 有上下界的网络流

点击打开链接 题意:给定m条边和n个节点,每条边最少的流量和最多的流量,保证每个节点的出入流量和相等,问可以形成吗,可以则输出每条边的流量 思路:一道有上下界的网络流,因为有下界,说明我们每条边必须跑大于等于下界的流量,那我们可以转化一下,将下界设为必要边,也就是我们肯定会跑的边,而且这道题是没有源点和汇点的,所以我们要加这两个点,而对于一条边,a,b,low,high,我们a->b连的流量为high-low,a->T为low,S->b为low,跑最大流,如果满流则方案成功,找边的流量输

关于流量有上下界的网络流问题的求解

之前涉及到的网络流问题,每条弧的容量下限都是0,上限都是C.而在流量有上下界的网络流问题中,每条弧有一个流量下界low,还有一个上界up. 对于这样的问题,一般都三类: 1.没有源点和汇点的有上下界的网络最大流问题 2.有源点和汇点的有上下界的网络最大流问题 3.有源点和汇点的有上下界的网络最小流问题 第一类问题: (没有源点和汇点的有上下界的网络最大流问题) [1]我们需要构造一个伴随网络,首先建立一个附加源点SS和一个附加汇点TT: [2]对于原网络中的每一个顶点Vi,在伴随网络中加一条新的