✅ 操作成功!

网络流

发布时间:2023-06-12 作者:admin 来源:文学

网络流

网络流

-

2023年3月17日发(作者:项目式学习)

IOI2004国家集训队作业:研究报告安徽周源

一种简易的方法求解流量有上下界的网络

中网络流问题

安徽周源

研究命题

一般的,定义一个网络是一个加权的有向图G=(V,E,C),E中的每条弧(u,v)都有一个

容量上界C(u,v)≥0。

如果人为的规定V中的两个点s和t,其中s没有入度而t没有出度;并为E中的每条弧

(u,v)赋予一个值f(u,v)≥0,f满足以下两个条件:

①除s,t之外的任意一个点i都满足:



EviEiu

vifiuf

),(),(

),(),(;

②任意一条E中的弧(u,v),都满足f(u,v)≤C(u,v)。

则称f是G的一个可行流,称s为流的源且t是流的汇。前一个条件被称为流量平衡条

件,而后者则是容量限制条件。

而如果一个可行流f使原点提供的流量

Eis

isf

),(

),(达到最大,则称f是G网络的最大流。

如果为G中的每条边再加入一个容量下界:令G=(V,E,B,C),B(u,v)表示弧(u,v)的容

量下界。这样G就是一个容量有上下界的流网络。类似的定义G中的可行流f:

①除s,t之外的任意一个点i都满足:



EviEiu

vifiuf

),(),(

),(),(;

②任意一条E中的弧(u,v),都满足B(u,v)≤f(u,v)≤C(u,v)。

同时可以定义G中的最大流f

max

,对容量有上下界的网络来说,还可以定义这个网络的

最小流f

min

:使原点提供流量

Eis

isf

),(

min

),(达到最小的流。

在这篇文章中,我们的讨论就将围绕容量有上下界的网络展开,经过一些必要的讨论,

最后将得到用于解决这一系列问题的一个较为简单的,有着较好的应用价值的算法。

正文

第一部分

为了最终能够解决问题,不妨来看一个简化版的问题:

[问题1.1]在一个有上下界的流网络G中,不设源和汇,但要求任意一个点i都满足流量

IOI2004国家集训队作业:研究报告安徽周源

平衡条件:





EviEiu

vifiuf

),(),(

),(),(

且每条边(u,v)都满足容量限制B(u,v)≤f(u,v)≤C(u,v)的条件下,寻找一个可行流f,或

指出这样的可行流不存在。

不妨称这个问题为无源汇的可行流。

[问题1.1的解答]仔细分析一下,由于普通最大流中对每条边中流量的约束条件仅仅是

f(u,v)≥0,而在这个问题中,流量却必须大于等于某一个下界。因此可以想到,设

f(u,v)=B(u,v)+g(u,v)(*)

其中g(u,v)≥0,这样就可以保证f(u,v)≥B(u,v);同时为了满足上界限制,有

g(u,v)≤C(u,v)-B(u,v)

令C’(u,v)=C(u,v)-B(u,v),则大致可以将g(u,v)看作无下界流网络C’中的一个可行流。

当然这样直接转化显然是不对的,因为这样仍无法体现“下界”这个条件。将(*)式代入流

量平衡条件中,对于任意一个点,有:







EviEiu

vigviBiugiuB

),(),(

)],(),([)],(),([







EviEiuEiuEvi

viBiuBiugvig

),(),(),(),(

),(),(),(),(

如果设:







EviEiu

viBiuBiM

),(),(

),(),()(

即M(i)为流入结点i的下界总和减去流出i的下界总和。

如果M(i)非负,那么有:

)(]),([),(

),(),(

iMiugvig

EiuEvi





(1)

设一附加源S

0

,则可以令

C’(S

0

,i)=M(i)。

如果M(i)是负数,那么有:







EiuEvi

iugiMvig

),(),(

),()(]),([(2)

设一附加汇T

0

,令

C’(i,T

0

)=-M(i)。

这里-M(i)是正数。

至此,附加图构造完毕。

在这样一个加入附加源和附加汇的流网络C’中,如果任意g(S

0

,i)或g(i,T

0

)都达到满载,

那么C’中的这一个可行流g一定对应原网络G中的一个可行流f;反之G中的任意一个可

行流f都可以对应C’中的一个g(S

0

,i)或g(i,T

0

)都满载的流。

而让从附加源点流出的弧都满载的可行流,一定是一个从附加源到附加汇的最大流。因

此,求原网络G中的一个可行流等价于求C’中S

0

至T

0

的最大流,并判断从源点流出的弧是

否满载:如果满载,则[问题1.1]有解,否则一定无解。

IOI2004国家集训队作业:研究报告安徽周源

第二部分

[问题1.2]在一个容量有上下界的流网络G中,求源点s到汇点t的一个可行的最大流。

[问题1.2的解答]如果从s到t有一个流量为a的可行流f,那么从t到s连一条弧(t,s),

其流量下界B(t,s)=a,则这个图一定有一个无源汇的可行流:除了弧(t,s)的容量为a外,

其余边的容量与f相同。

如果从s到t的最大流量为a

max

,那么从t到s连一条下界B(t,s)=a’>a

max

的弧(t,s),

则从在这个改造后的图中一定没有无源汇的可行流:否则将这个可行流中的弧(t,s)除去,就

得到了原图中s到t的流量为a’的流,大于最大流量a

max

,产生矛盾。

如果给定一个参数a,如何判断在G中从s到t是否有一个流量为a的可行流呢?综上

所述,判断在G中是否有a的可行流和判断在改造后的图中是否有一个无源汇的可行流完

全等价。因此,执行一次普通最大流算法,就可以完成这个任务了。

下面回到[问题1.2]中来,我们不妨二分枚举这个参数a,每次改造图后执行一次最大流

来判断是否有s到t的流量为a的可行流。这样找到a能取到的最大值,也就是G图中的最

大流a

max

了。

在一般问题中,如果所有弧上的容量为整数,那么算法一定可以在有限次计算之后停止,

而算法的时间复杂度约为[log

2

流量]次的最大流过程,采用朴素的预流推进算法,执行一次

最大流算法约需要O(N3)的时间,而[log

2

流量]基本可以看作与[log

2

N]看作同阶。因此这个算

法的时间复杂度约为O(N3log

2

N)。

在实际应用中,这个算法是非常有价值的。但从纯理论上说,这并不是一个多项式算法,

特别是当流量可能为小数的时候,算法可能会无止境的执行下去。一种解决方法是规定一个

较小的误差范围,这样算法的时间复杂度为O(N3*[log

2

精度]):从理论上说,这也只能算一

个近似算法。另一种解决方法则是直接将答案离散为整点再进行二分,这样最多有O(2N)

个整点,因此算法的时间复杂度为O(N4)。当然这种方法效率不算很高,而且实现起来很麻

烦,在实际竞赛中也并不需要仅仅为追求理论上的“快感”而做出这么大的牺牲。

[问题1.3]在一个容量有上下界的流网络G中,求源点s到汇点t的一个可行的最小流。

[问题1.3的解答]与[问题1.2]类似,只是在加入弧(t,s)后二分(t,s)的容量上界C(t,s)即可。

此类问题还有一些简易的扩展,如求容量有上下界的流网络G中的最小费用最大流之

类,其本质思想都是“二分参变量”,这里不再赘述。

附录

SGU中两道流量有下界试题:

p194ReactorCooling和p176FlowConstruction;

👁️ 阅读量:0