最大流 标号法
0
2 8
30
8 18
京
0
沈
W ( f* ) =10+6+12+30+12+10+5 = 85
多个发点多个收点的情形
对于多发点多收点的容量网络的最大流问题可 以通过添加两个新点vs与vt扩充为新的单发点与 单收点的容量网络的方式解决。
x1 x2 ... xm y1 y2 ... yn
vs
+∞
+∞
vt
x1 x2 x3 xn y1 y2 y3 ym
…
…
如果记X={x1, x2, …, xn},Y={y1, y2, …, ym},则该二 部图可记为G=(X, Y, E),而上述的工作匹配问题就 是:在图G中找一个边集E的子集,使得这个子集 中任意两条边没有公共端点,最好的方案就是要使 得该子集中的边数达到最大。 定义:对于二部图G=(X, Y, E),M是边集E的一个 子集,如果M中的任意两条边没有公共端点,则称 M是图G的一个匹配(也称对集)。 M中任意一条边的端点v称为(关于M的)饱和点, G中的其他顶点称为非饱和点。 若不存在另一匹配M1使得| M1 | > | M |,则称M为最 大匹配。
下面用实例说明具体的操作方法:例
v2 (3,3) (4,3) v4 (5,3) (3,0) (2,1) v1 (2,2) v3
vs
(5,1)
(1,1)
(1,1)
vt
在图中给出的可行 流的基础上,求vs 到vt的最大流。
(3,3) v2 (4,3) (1,0) v4 (5,3) vt
(-v1,1)
v2
割集 割集(V1, V2)中所有起点在V1,终点在V2的边的容量 的和称为割集容量。例如下图中所示割集的容量为5
v2 4 1 v4
3
vs 5 v1 1 3
5
vt 2
2
v3
在容量网络的所有割集中,割集容量最小的割集称为 最小割集(最小割)。
对于可行流f={fij},我们把网络中使fij=cij的 弧称为饱和弧,使fij<cij的弧称为非饱和弧;把 使fij=0的弧称为零流弧,使fij>0的弧称为非零 流弧。 若μ 是联结发点 v2 4,1 v4 vs和收点vt的一条链, 3,1 5,2 1,0 我们规定链的方向是 vs 3,1 1,0 vt 从vs到vt,则链上的 2,1 5,2 v1 2,2 v3 弧被分成两类:前向 弧、后向弧。 设f是一个可行流,μ是从vs到vt的一条链,若μ 满足前向弧都是非饱和弧,后向弧都是都是非零 流弧,则称μ是(可行流f的)一条增广链。
注:有向边也称为弧。
对教材P259定义21的解释
v1 vs v3 vt v2
v4 边集(vs,v1),(v1,v3),(v2,v3),(v3,vt), (v4,vt)是G的割集。其顶点分别属于两个互补不相交 的点集。去掉这五条边,则图不连通,去掉这五条边中 的任意1-4条,图仍然连通。
割集的容量(简称割量) 最小
vs
x1 x2 x3 y1 y2 y3
vt
…
…
xn
ym
这样最大匹配问题就化为对上图的网络的最大流问题。
例
有5位求职者和5项工作岗位,这5位求职者各自能胜 任的工作如图所示,问如何安排才能实现最大就业?
x1 y1 y2 y3 y4 y5 x2 x3 x4 x5
vs
vs
首先将原图扩充成一个容量网络,其中每边的容量均 为1。然后用标号法来求最大流。
[x2,1] y1 [x1,1] y2 [x1,1] y
3
1 [y2,1] v
s
x4 [vs,1] x5 [vs,1]
[x5,1] 1 y4
y [x4,1]5
1
x1 1
1 1
1 1 1
y1 1
y2 y3 y4 y5 1 1 1
vs
1
1
x2 1 x3 x4 x5
1
vs
最大匹配为(省略了最后一步的标号过程):
vs
x2 [vs,1] x3 [vs,1] x4 [vs,1] x5 [vs,1]
x1
1
1
y1
y2 1
vs
[-,+∞]
1
x2 [vs,1] x3 [v ,1] x4 s x5 [vs,1] 1
y3 [x3,1] 1 y4 [x3,1] y5
vs
[y5,1]
vs
[-,+∞]
[-y1, 1] 1 x1 1 [-y , 1] x2 4 1 1 x3 1 1
成都 成都 重庆
重庆 10
武汉 5 5
上海 15
西安 8 6
郑州
沈阳
昆明 12 15
广州 10
北京 30 25
武汉
上海 西安 郑州 沈阳 昆明 广州
10
15 8 6 14 8 8 2 6 8 18 10 10 8
用图来描述就是
6
重
西
6
郑
10 8
成
5 12
25 15
昆
8
8
15 10 14
8
30 15 5
v3
(4, 0)
[-v4, 2]
如图已经得到增广链,然后进行调整。
调整后的可行流如下图:
[vs, 1]
v2
(4, 3)
[v2, 1]
v4
(5, 5) (4, 3)
vs [v , 1]
5
(1, 0)
[-, ∞] vs (5, 2) (1, 0)
(3, 2) (2, 0)
v5 v1
[vs, 3] (2, 2)
下面的二部图表示了一个匹配问题
x1 x2 y1 y2 y3 y4 y5
x3 x4
它有如下两个最大匹配:
x1 x2 x3 x4 y1 y2 y3 y4 y5 x1 x2 x3 x4 y1 y2 y3 y4 y5
最大匹配问题可以化为最大流问题求解。化的方式 类似于多发点多收点问题,具体做法是: 在原二部图中添加两个点vs和vt,其中vs有以它为 起点,以X中各点为终点的有向边;连结vt有以它 为终点,Y中各点为起点的有向边。并且在这样的 图中各边上的容量取为1。若一条边上的流量为1, 则表示一个相应的分配。如下图
具有实际背景的例子
• 国庆大假期间旅游非常火爆,机票早已订购 一空。成都一家旅行社由于信誉好、服务好, 所策划的国庆首都游的行情看好,要求参加 的游客众多,游客甚至不惜多花机票钱辗转 取道它地也愿参加此游。旅行社只好紧急电 传他在全国各地的办事处要求协助解决此问 题。很快,各办事处将其已订购机票的情况 传到了总社。根据此资料,总社要作出计划, 最多能将多少游客从成都送往北京以及如何 取道转机。下面是各办事处已订购机票的详 细情况表:
最大流问题
基本概念
v2 3 vs 5 v1 2 v3 1 1 3 2 4 v4
5
vt
给定一个有向图G=(V,E),其中仅有一个点的入次 为零称为发点(源),记为vs,仅有一个点的出次为 零称为收点(汇),记为vt,其余点称为中间点。 对于G中的每一个弧(vi,vj),相应地给一个数cij (cij≥0),称为弧(vi,vj)的容量。我们把这样的D称 为网络(或容量网络),记为G=(V,E,C)。
x1 x2 x3 x4 x5 y1 y2 y3 y4 y5
(v2,1)
v4 (5,3) (1,1) (3,0) v3
(-,+∞)
vs
(3,3)
(4,3)
(v3,1) (-,+∞)
vt vs (1,0)
(1,1)
(3,0) (2,2) v3
(5,1)
(2,1)
(5,2)
(vs,4)
v1
(2,2)
(-v2,1)
(vs,3)
v1
(2,2)
得增广链,标号结束, 进入调整过程
可行流是指满足如下条件的流: (1)容量限制条件:对G中每条边(vi,vj), 有
0 f ij c ij
(2)平衡条件: 对中间点,有:
j
f ij
k
f ki
(即中间点vi的物资输入量等于输出量) 对收点vt与发点vs,有:
i
f si
j
f jt W
(即vs发出的物资总量等于vt接收的物资总量),W是 网络的总流量。
给定容量网络G=(V,A,E),若点集V被剖分 为两个非空集合V1和V2,使 vs∈V1 ,vt∈V2, 则把弧集(V1,V2)称为(分离vs和vt的)割集。
v2
3 vs 1 1 3 4 v4 5 vt
5
v1 2 v3
2
显然,若把某一割集的弧从网络中去掉, 则从vs到vt便不存在路。所以,直观上说,割 集是从vs到vt的必经之路。
标号过程: (1)给vs标号(-,+∞),vs成为已标号未检查的点,其 余都是未标号点。 (2)取一个已标号未检查的点vi,对一切未标号点vj: 若有非饱和弧(vi,vj),则vj标号(vi,l(vj)),其中l(vj)= min[l(vi),cij – fij],vj成为已标号未检查的点;若有非 零弧(vj,vi),则vj标号(-vi,l(vj)),其中l(vj)=min[l(vi), fji], vj成为已标号未检查的点。vi成为已标号已检查的点。 (3)重复步骤(2),直到vt成为标号点或所有标号点 都检查过。若vt成为标号点,表明得到一条vs到vt的 增广链,转入调整过程;若所有标号点都检查过, 表明这时的可行流就是最大流,算法结束。 调整过程:在增广链上,前向弧流量增加l(vt),后 向弧流量减少l(vt)。