【网络流】最大流:点带需求的流通、边带下界的流通

1)点带需求的流通:

新的框架特点:有多个供给点(d(v)<0),都称作源点;有多个需求点(d(v)>0),都称作汇点。同时仍然满足传统最大流中的容量条件(0 <= f(e) <= cap(e))和需求条件(f_in(v) - f_out(v) = d(v))。

需要解决的问题:由于有多个源点和汇点,所以不再考虑最大化问题,而是考虑有没有满足容量条件和需求条件的一个可行流通(可行性)。


判断可行性的方法是,把带需求{ d(v) }的可行流通问题转换为在另一个网络中找最大 s-t 流的问题。另一个网络的构造方法如下

【网络流】最大流:点带需求的流通、边带下界的流通_第1张图片

给个例子就是这样的:

【网络流】最大流:点带需求的流通、边带下界的流通_第2张图片

在G‘中找最大 s-t 流,那么最大流的值是多少才能证明原图G中存在可行流通???答案是P272,定理7.50:

G中存在一个带{ d(v) }的可行流通,当且仅当G’的最大 s*-t* 流有值D(其中,D是所有需求的和,同时也是所有供给的和)。



2)点带需求 和 边带下界的流通:

新的框架特点:有多个供给点(d(v)<0),都称作源点;有多个需求点(d(v)>0),都称作汇点;同时,每些边e有最小流量 low(e) 的要求(即,必须使用某些边,且仍然满足传统最大流中的容量条件(low(e) <= f(e) <= cap(e))和需求条件(f_in(v) - f_out(v) = d(v))。

需要解决的问题:由于有多个源点和汇点,所以不再考虑最大化问题,而是考虑有没有满足容量条件和需求条件的一个可行流通(可行性)。


判断可行性的方法是,把点带需求{ d(v) }和边带下界{ low(e) }的可行流通问题转换为在另一个只有点带需求{ d(v) }网络中判断可行流通的问题,进而转换为在第三个网络中找最大 s-t 流的问题。另一个网络的构造方法如下

对于所有有容量下界 low(e) 的边,将容量变得 0 <= f(e) <= cap(e) - low(e),相当于提前提供了 low(e) 这么多流量的保障;那么,e的尾部节点v应该还能提供的流量要相应减少low(e);同时,e的头部节点v应该在原有流量需要的基础上,再加上强加给它的low(e)的需求!可能没描述清楚,看图:

【网络流】最大流:点带需求的流通、边带下界的流通_第3张图片


去下界的转换相当于 v w low(e)个流量已经流过去,那要不要加容量为low(e)的反向边?
答案: 不用。反向边相当于给了后悔的机会,加了反向边,之后就可以把已经流过去的low(e)个流量又推回来,这不是我们想要看到的。

你可能感兴趣的:(算法与数据结构)