最大流问题

http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html


1概述

设有向网络NVA),V顶点,A是边,其中,Vs是源, Vt 是汇。网络中有通过边aij从源到汇的流,但边流量不超过cij 问该网络的最大流量为多少? 这个问题,称为最大流问题。它是网络流中最经典的问题之一。最大流问题广泛地应用在交通运输、供水、油管供油、邮电通讯,也可以用在生产安排,管理优化等实际问题上。

2. 求最大流的方法

这里介绍最大流问题有两种解法。一是通过线性规划,二是弧标号法(图上作业法)。

先给出一个例题。
最大流问题_第1张图片

1

 

2.1用线性规划求解最大流问题

我们把每条边的流量当作一个变量xij。我们记最大流量的流量为f

对每一顶点,满足流量平衡等式。最大流问题_第2张图片

 

另外,0<=xij<=cij

2.2弧标号法(图上作业法)

用线性规划求解最大流问题显然很繁琐,这里介绍的弧标号法会简单一些。弧标号法本质上就是一种穷举法,不断地增加流量,直到不能增加为止。

第一步,初始化。在每一边的两端进行标号,标号记录允许通过的流量,即容量。

如图2所示。边a12的两边分别为50,表示c12=5,而c21=0

最大流问题_第3张图片

 

2

第二步,寻找增益路。

1出发,发现到2的容量为5,到3的容量为6,到4的容量为5,所以到3的容量最大;而在3这一点,36容量最大,为767容量最大,为7。这样就找到了一条增益路

1——3——6——7,在这条路上,最大的流量为6

最大流问题_第4张图片

 

3

 

第三步,调整标号。

在增益路上,边的左端减去流量,边的右端加上流量。如图4所示。 最大流问题_第5张图片

4


 

第四步,重复。

重复第二步,直到没有增益路。 最大流问题_第6张图片

5

第五步,最大流量。

通过连通1的边算出最大流量。如图5中第6小图,有最大流量为

5-0+6-0+5-2=14

3matlab代码

有关网络流的matlab代码需要matlab_bgl工具箱,在网上可以下载。

 

cm = sparse([1 1 1 2 2 3 3 3 4 5 5 6 6],[2 3 4 3 5 2 5 6 6 6 7 5 7],...

     [5 6 5 2 3 2 3 7 5 1 8 1 7],7,7)%构建图

 [flowval cut R F] =max_flow(cm,1,7)

 view(biograph(F,[],'ShowWeights','on'))

最大流问题_第7张图片

 matlab算出的结果也为14.

你可能感兴趣的:(图论)