带有上下界的网络流

转自:http://blog.csdn.net/clove_unique

f(u,v)表示u->v这条边的实际流量 
b(u,v)表示u->v这条边的流量下界 
c(u,v)表示u->v这条边的流量上界 
在一个无源汇的普通网络流图中,满足

  • 0≤f(u,v)≤c(u,v)
  • ∑f(u,i)=∑f(i,v)

分别称为流量限制条件和流量平衡条件 
而在有上下界的网络流图中,由于多了流量下界b(u,v)的限制,满足

  • b(u,v)≤f(u,v)≤c(u,v)
  • ∑f(u,i)=∑f(i,v)

无源汇可行流

建图方法

将有上下界的网络流图转化成普通的网络流图

  • 首先建立附加源点ss和附加汇点tt
  • 对于原图中的边x->y,若限制为[b,c],那么连边x->y,流量为c-b
  • 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和 
    • 若d(i)>0,那么连边ss->i,流量为d(i)
    • 若d(i)<0,那么连边i->tt,流量为-d(i)

求解方法

在新图上跑ss到tt的最大流 
若新图满流,那么一定存在一种可行流 
此时,原图中每一条边的流量应为新图中对应的边的流量+这条边的流量下界

证明

在原图中,假设每条边的实际流量为f(u,v)=b(u,v)+g(u,v) 
其中g(u,v)≤c(u,v)−b(u,v)

我们可以将原图中的边改为上界为c(u,v)−b(u,v)的边,变成一个普通的网络流图 
经过以上的改造,g(u,v)实际上是新图中边u->v的实际流量,原图中的实际流量f(u,v)=b(u,v)+g(u,v) 
但是如果在这个新图中直接求可行流的话是错误的

举个栗子 
原图 
 
按照上面的方法改造过的新图 
 
这个图的可行流为1,还原成原图的实际流量为 
 
很显然满足流量限制条件,但是不满足流量平衡条件

由于需要满足流量平衡条件 
∑f(u,i)=∑f(i,v) 
∑[b(u,i)+g(u,i)]=∑[b(i,v)+g(i,v)] 
∑b(u,i)−∑b(i,v)=∑g(i,v)−∑g(u,i) 
令d(i)=∑b(u,i)−∑b(i,v) 
当d(i)>0时 
∑g(i,v)=∑g(u,i)+d(i) 
所以需要一条边流量为d(i)来补流 
 
当d(i)<0时 
∑g(u,i)=∑g(i,v)+[−d(i)] 
所以需要一条边流量为−d(i)来分流 
 
可以发现,添加的所有与附加源点或者附加汇点相连的边必须满流,原图才有可行流 
证毕

有源汇可行流

建图方法

在原图中添加一条边t->s,流量限制为[0,inf] 
即让源点和汇点也满足流量平衡条件 
这样就改造成了无源汇的网络流图 
其余方法同上

求解方法

同 无源汇可行流

证明

同 无源汇可行流

有源汇最大流

建图方法

同有源汇可行流

求解方法

在新图上跑ss到tt的最大流 
若新图满流,那么一定存在一种可行流 
记此时∑f(s,i)=sum1 
将t->s这条边拆掉,在新图上跑s到t的最大流 
记此时∑f(s,i)=sum2 
最终答案即为sum1+sum2

证明

添加附加源汇的作用:为了满足流量平衡条件,在新图中进行相应的补流或分流 
只要连接附加源汇的边满流,新图中s->t的任意一种可行流都是原图的可行流 
跑ss->tt的最大流了之后,相当于是使连接附加源汇的边满流,进而求出了一种可行流 
再将t->s的边拆掉(使s->t变成一个有源汇的网络流图),跑s到t的最大流,加上跑出来的最大流即为原图中一种可行的最大流

有源汇最小流

建图方法

同 无源汇可行流

求解方法

求ss->tt最大流 
连边t->s,inf 
求ss->tt最大流 
答案即为边t->s,inf的实际流量

证明

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

有源汇费用流

建图方法

将有上下界的网络流图转化成普通的网络流图

  • 首先建立附加源点ss和附加汇点tt
  • 对于原图中的边x->y,若限制为[b,c],费用为cost,那么连边x->y,流量为c-b,费用为cost
  • 对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和 
    • 若d(i)>0,那么连边ss->i,流量为d(i),费用为0
    • 若d(i)<0,那么连边i->tt,流量为-d(i),费用为0
  • 连边t->s,流量为inf,费用为0

求解方法

跑ss->tt的最小费用最大流 
答案即为(求出的费用+原图中边的下界*边的费用)

证明

注意: 
有上下界的费用流指的是在满足流量限制条件和流量平衡条件的情况下的最小费用流 
而不是在满足流量限制条件和流量平衡条件并且满足最大流的情况下的最小费用流 
也就是说,有上下界的费用流只需要满足网络流的条件就可以了,而普通的费用流是满足一般条件并且满足是最大流的基础上的最小费用

证明同 有源汇的可行流

时间: 2024-08-01 15:20:23

带有上下界的网络流的相关文章

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

有上下界的网络流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-无源汇带上下界网络流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. 求的是最大流. 很久之前就看了带上下界的网络流,一直没看懂

【网络流补全计划】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) 至此,我们可以将有上下界的网络流分为几种问题来对待,接下来就

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,在伴随网络中加一条新的