网络流算法介绍

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

s 3 2 v2
v1
(2,4)
2
t
残量网络

s
3
4 v1 2 2 v2


2
t
2
从残量网络中可以清 楚地看到: 因为存在边(s,v2) = 3,则知道从S到v2还 可以再增加2单位的 流量; 因为存在边(v1,t) = 2, 则从v1到t还可以再 增加2单位的流量。
后向弧

s 3
4 v1 2

v2
网络的流量、最大流
一个合法的网络流量|f|定义为:
从源点流出的流量 流向汇点的流量
∑f(s,v) ∑f(v,t)
|f|的最大值表示为最大流
流网络示例
收支平衡 网络的流量 |f| = 5+3=8
或等于5 + 2 + 1(汇点处)
0 <= |f| <= 最大流 f(v4,v6) = -f(v6,v4) = 1
Leapin' Lizards



题意:有一间房子,有n*m个pillars,第一个矩阵表 示相应的pillars能跳几个Lizards,第二个矩阵表 示哪个pillars上有Lizard. d表示能跳的最大范 围.Lizard跳出边界就能逃跑,问最少还有几个 Lizards跑不了. 思路:拆点,最大流.将每个>0的pillars拆开,有L 的点由源点向其引一条边,边容量为1,能跳出边 界的点向汇点引边,边容量为无穷. 其他题目: pku 3498
二分图匹配例题BOJ1155
二分图增广路

由增广路定义可以得出: 1、path的长度必为奇数,且第一条边和最后 一条边为不匹配边。 2、path经过路径取反操作以后,得到比当前 更大的匹配。 3、当找不到增广路径时候,得到的匹配即为 最大匹配。 与增广路求最大流算法很类似
最大流和二分图匹配


实际上二分图可以改造成一个流网络 把X,Y的边改成从X到Y的有向边,并赋值为 1,表示从X到Y容量为1。 添加源点s,s到X部每个点的容量都为1。 添加汇点t,Y到t部每个点的容量都为1。 以此建立的流网络求得到最大流,即为原二分 图中的最大匹配数。
二分图匹配例题BOJ1155





找增广路径 int path(int v) //从X部的V点找增广路径 { for(int i = 1; i <= m; i++) { if(g[v][i] && !visited[i]) //找到未匹配边 { visited[i] = true; if(match[i] == -1 || path(match[i]) == 1) { match[i] = v; //路径取反操作 return 1; } } } return 0; }
增广路径

在残量网络中,从源点S出发到汇点T的一 条路径。 增广路径上的最小残量表示该网络还可增 加的额外流量。

点集间的流量
定义点集间的流量:f(X, Y) = ∑ ∑f(x, y) x∈X y∈Y 则有: f(X,X) = 0 (流的对称性) f(X,Y) = -f(Y,X) (流的对称性) f(X∪Y,Z) = f(X,Z) + f(Y,Z) f(X,Y∪Z) = f(X,Y) + f(X,Z)
1 2 3 4 5
1
2
3
4
二分图匹配

给定二分图G,在G的子图M中,M的任意两 条边都不共点,则称M为G图的一个匹配。 M中边数最大的子集称为G的最大匹配。
如果在最大匹配中,边涵盖了图中所有的点, 则这样的匹配为完美匹配。


匈牙利算法

实际上它也是一种不断寻找增广路径的算法 增广路径定义: 若path是图G中一条连通两个未匹配顶点 (分别属于X,Y)的路径, 并且属M的边和不属M的边(即已匹配和待 匹配的边)在Path上交替出现, 则称Path为相对于M的一条增广路径。
Cable TV Network


题意:一个无向图,问去掉几个点使得其不连通. 思路:最小点割集,根据最小割最大流定理求解. 拆点,求最大流.因为此题没有明确的源点和汇 点,所以要枚举源点和汇点,然后求最大流,最大 流的最小值就是最小割的最小值. 其他题目: POJ3469
二分图


二分图作为流网络的一个特例,我们既可以特 别去讨论它,也可以从网络流的角度来理解它。 定义:二分图又称二部图,它是一个无向图, 图的顶点分成两个不相交的点集X, Y. 对于图中任意一条边的两端点分别来自不同点 集。

x∈S y∈T
<= ∑ ∑c(x, y)
= c(S, T) 所以有最小割等于最大流
x∈S y∈T
最小割最大流定理

网络的最大流等于最小割
f是网络的最大流 残量网络中无可增广路径 存在某个切割(S,T),使f = c(S, T)



以上三个命题是等价的,证明之:
1 —> 2



反证法 假设残量网络中还有增广路径, 增广路径上的流量至少为1 由该路径增广后的流量>f 与f是最大流矛盾
流网络定义(Flow Network)





V表示整个图中的所有结点的集合. E表示整个图中所有边的集合. G = (V,E) ,表示整个有向图. s表示网络的源点, t表示网络的汇点. 对于每条边(u,v),有一个容量c(u,v) (c(u,v)>=0) 如果c(u,v)=0,则表示(u,v)不在网络中。 如果原网络中不存在边(u,v),则令c(u,v)=0 对于每条边(u,v),有一个流量f(u,v).
最大流例题BOJ1154

寻找增广路 bool findload() { memset(visited,0,sizeof(visited)); head = tail = 0; queue[tail++] = s; while(head < tail) { j = queue[head++]; for(i = 1; i <= m; i++) if(!visited[i] && cap[j][i] > 0) //cap为容量,本题可以直接表示为残量 { pre[i] = j; //路径标志 visited[i] = 1; if(i == t) return true; //找到s-t通路 queue[tail++] = i; } return false; }
容量限制
f(v6,v4)图中不给出
残量网络

对于网络中的每一条边,计算容量与流量 的差即表示为残量。


R(u,v) = C(u,v) – F(u,v)
形象的说,一条边的残量即为该边还能流 过的流量。
残量网络举例
原网络 残量网络
s
(4,4) (0,3) (2, 2) 4 v2 (2,2) t v1 2 2
2
2 t

其中像(v1,s)这样的边 称为后向弧,它表示从 v1到s还可以增加4单 位的流量。 但是从v1到s和原网络 中的弧的方向相反。 这样的弧称为后向弧。 问题:有必要建后向 弧线?
为什么要建立后向弧



在寻找最大流的过程中,有些弧的选择一开始 可能就是错误的。 所以在路径中加上后向弧,作为标记。 当发现了另一条可增广的路径是并包含后向弧, 意味这条路径对以前对这条弧顶选择进行取消 后向弧为算法纠正自己所犯的错误提供了可能 性,它允许算法取消先前的错误的行为
最小切割时使c(S,T)最小的切割
割的流量
任意割的流量等于网络的流量 证明: f(S,T) = f(S,V) – f(S,S) = f(S,V) + 0 = f(s, V) + f(S-{s}, V) = f(s, V) + 0 = |f|

割的流量
网络的流量小等于任意割的容量 证明: |f| = f(S, T) = ∑ ∑f(x, y)
最大流模型构图


对于求流网络最大流的算法我们可以有现成的模板 套用,在实际问题中,如何去构图建立最大流模型 才是解决问题的难点和关键。 构图一般考虑下面几个要素: 1、问题是否符合求源点到目标点的所经过网络的等 效最大流。 2、找准源点和汇点 3、源点和网络中的点,汇点和网络中点的关系。 4、网络中的个点的关系。 5、明确什么是容量、流量、残量。
网络流算法介绍
1.基本概念 2.最大流问题求解 3.二分图匹配 4.二分图最佳匹配
关键词: 源点、 汇点、 容量、 流量、 残量、 费用、 增广路径
Fra Baidu bibliotek
网络流问题
类比:求最短路径 把实际问题的道路地图抽象为有向图,然后 用一定算法求解最短路径。 我们也可以将一个有向图看作一个流网络来 解决另一类型的问题 。 匹配问题、运输问题、任务分配问题。。。
流网络示例
流速/流量f 流速限制 容量c
水源
蓄水池 汇点T 水管/边
源点S
网络流三个性质

容量限制:f(u,v) <= c(u,v) 对称性:f(u,v) == -f(v,u) 收支平衡: 对于不是源点也不是汇点的任意结 点,流入该结点的流量和等于流出该结点的流 量和。
只要满足这三个性质,就是一个合法的网络流.
最大流例题BOJ1154





求最大流 int maxflow() { int i, j, flow = 0, min; //min为增广路径上的瓶颈流量;flow网络最大流 while(findload()) { min = 0x7ffffff; for(i = t; i!= s; i = pre[i]) min <?= cap[pre[i]][i]; //找增广路径的瓶颈流量 flow += min; for(i = t; i != s; i = pre[i]) //更新路径上的流量 { cap[pre[i]][i] -= min; //前向弧加min cap[i][pre[i]] += min; //后向弧减min } } return flow; }
求最大流的增广路算法


每次用BFS找一条最短的增广路径; 然后沿着这条路径修改流量值(实际修 改的是残量网络的边权)。 路径上的后向弧+流量值 路径上的前向弧-流量值 当没有增广路时,算法停止,此时的流 就是最大流。
最大流例题BOJ1154


典型的最大流问题 已知网络容量,求最大流量 根据题意构图如下: 1为源点,M为汇点. 容量为题目已知给出,可能的情况是相同两个结点之间 有多条水渠,将它们累加即可. 初始化流量网络为0,则残量网络即初始为容量网络. 算法流程: 构图->求最大流->输出最大流
最大流和二分图匹配





对上述的流网络求最大流的增广路算法我们已 经了解了。 每次找增广路时必然是以条从s到t的通路,除 去s到X,Y到t两条边,剩下的边必然是在原二 分图中交替前进。 前向弧表示尚未匹配的边 后向弧表示已经匹配的边 路径取反操作实际上是更新流量操作
二分图匹配的构图

2 —> 3




此时的残量网络中不存在s-t通路 定义S为s可达的点集 定义T为可达t的点集 显然S+T = V (S,T)中所有弧都满载,否则残量网络将不为0, 使s-t有通路 所以|f| = c(S,T)
3 —> 1

由|f| <= c(S,T)(任意割) 当|f| == c(S,T) |f|为最大值 从上面的证明,我们可以得到求最大流从增广 路径算法。 从2->3的证明给出了从最大流构造最小割的过 程,即求出s的可达点集S, 再令T = V - S
首先划分“对立”的两个集合
明确每个匹配关系的含义 明确最大匹配的意义 从最大流的构图方法来入手
二分图匹配例题BOJ1155



中文题目,题意好理解 构图:考虑将墙面看成一个国际象棋的棋盘,那 么每块瓷砖贴在棋盘上必然占一格白格和一格 黑格. 用棋盘的黑色格子表示二分图X部 用棋盘的黑色格子表示二分图Y部 相邻的格子用一条边连接
点集间的流量

不包含s,t的点集,与它关联的边上的流量和为 零
x∈X v∈V
证明:f(X, V) = ∑ {∑f(x,v)} = ∑0
x∈X
(流量收支平衡)
=0
网络中的割

割(S,T)由两个点集S,T组成,满足 1、 S + T = V 2、 源点在S集合中 3、 汇点在T集合中 4、 f(S,T)表示割的流量 5、 c(S,T)表示割的容量
相关文档
最新文档