网络流最大流算法

合集下载

最大流问题的求解方法及应用

最大流问题的求解方法及应用

最大流问题的求解方法及应用
最大流问题,是指在一个有向图中,从源点 s 到汇点 t 的最大
流量。

在实际应用中,最大流问题往往用于描述网络传输、油管输送等流量分配问题。

求解最大流问题的方法包括以下几种:
1. 网络流算法:这是一种基于图论和线性规划的算法。

通过构建网络流图,将最大流问题转化为最小割问题,再利用线性规划求解最小割问题的对偶问题来求解最大流问题。

2. 增广路算法:这是一种经典的最大流算法,其基本思想是不断找到增广路径,即从源点 s 到汇点 t 的一条路径,沿途边权
均有剩余容量,使得该路径上的边的剩余容量中的最小值最大化,最终得到最大流。

3. 矩阵树定理:这是一种基于图论和矩阵运算的算法,适用于有向图和无向图。

通过计算图的拉普拉斯矩阵的行列式等方法,求得图的生成树个数,从而计算最大流。

4. Dinic算法:是对增广路算法的改进。

在增广路算法中,每
次查找增广路径的过程需要遍历整个图,为了提高效率,
Dinic算法引入了分层图的概念,将图分层之后只在图的一层
中查找增广路径,最终求得最大流。

这些方法在实际应用中常常被用来解决路由选择、网络流量优化、模拟电路分析等问题。

例如,最大流可以被用来优化数据传输、流水线设计、流量管道的运营和管理,提高资源利用率和数据传输速度。

网络流——求网络最大流

网络流——求网络最大流

4 1 4 8
4 2 2 6
7
9
(1,4) V2 (0,+∞) V1
(2,4) V4 (4,4) V6
(1,8)
V3
V5 (2,1)
4 1 4 8
4 2 2 6
7
9
(-4,2) V2 (0,+∞) V1 4 4
(3,2) V4 4
(4,2) V6
(1,8)
V3
V5 (3,2)
4 1 4 8
4 2 2 6
7
9
(5,2) V2 (0,+∞) V1 2 4 4 V4 6
(5,2) V6
2
(1,6)
V3
V5 (3,2)
4 1 4 8
4 2 2 6
7
9
V2 (0,+∞) V1 4 4
4
V4
6 V6 2
2 2
(1,4)
V3
V5
存储结构
const maxn=100; type nodetype=record{可改进路顶点类型 可改进路顶点类型} 可改进路顶点类型 l,p:integer;{标号、检查标志 标号、 标号 检查标志} end; arctype=record{网顶点类型 网顶点类型} 网顶点类型 c,f:integer;{容量、流量 容量、 容量 流量} end; gtype=array[0..maxn,0..maxn] of arctype; ltype=array[0..maxn] of nodetype; var lt:ltype; g:gtype; n,s,t:integer;{顶点数、源点、汇点 顶点数、 顶点数 源点、汇点} f:text;
增广后的F

网络流入门--最大流算法Dicnic算法

网络流入门--最大流算法Dicnic算法

⽹络流⼊门--最⼤流算法Dicnic算法感谢WHD的⼤⼒⽀持最早知道⽹络流的内容便是最⼤流问题,最⼤流问题很好理解:解释⼀定要通俗!如右图所⽰,有⼀个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图⼀张. [1]是源点,有⽆限的⽔量,[4]是汇点,管道容量如图所⽰.试问[4]点最⼤可接收的⽔的流量?这便是简单的最⼤流问题,显然[4]点的最⼤流量为50死理性派请注意:流量是单位时间内的,总可以了吧!然⽽对于复杂图的最⼤流⽅法是什么呢,有EK,Dinic,SAP,etc.下⾯介绍Dinic算法()Dinic 算法Dinic算法的基本思路:1. 根据残量⽹络计算层次图。

2. 在层次图中使⽤DFS进⾏增⼴直到不存在增⼴路3. 重复以上步骤直到⽆法增⼴引⾃,相当简单是吧…⼩贴⼠:⼀般情况下在Dinic算法中,我们只记录某⼀边的剩余流量.残量⽹络:包含反向弧的有向图,Dinic要循环的,每次修改过的图都是残量⽹络,层次图:分层图,以[从原点到某点的最短距离]分层的图,距离相等的为⼀层,(⽐如上图的分层为{1},{2,4},{3})DFS:这个就不⽤说了吧…增⼴ :在现有流量基础上发现新的路径,扩⼤发现的最⼤流量(注意:增加量不⼀定是这条路径的流量,⽽是新的流量与上次流量之差)增⼴路:在现有流量基础上发现的新路径.(快来找茬,和上⼀条有何不同?)剩余流量:当⼀条边被增⼴之后(即它是增⼴路的⼀部分,或者说增⼴路通过这条边),这条边还能通过的流量.反向弧:我们在Dinic算法中,对于⼀条有向边,我们需要建⽴另⼀条反向边(弧),当正向(输⼊数据)边剩余流量减少I时,反向弧剩余流量增加I Comzyh的较详细解释(流程) :⽤BFS建⽴分层图注意:分层图是以当前图为基础建⽴的,所以要重复建⽴分层图⽤DFS的⽅法寻找⼀条由源点到汇点的路径,获得这条路径的流量I 根据这条路径修改整个图,将所经之处正向边流量减少I,反向边流量增加I,注意I是⾮负数重复步骤2,直到DFS找不到新的路径时,重复步骤1注意(可以⽆视):Dinic(其实其他的好多)算法中寻找到增⼴路后要将反向边增加IDinic中DFS时只在分层图中DFS,意思是说DFS的下⼀个节点的Dis(距源点的距离)要⽐⾃⼰的Dis⼤1,例如在图1中第⼀个次DFS中,1->2->4这条路径是不合法的,因为Dis[2]=1;Dis[4]=1;步骤2中“获得这条路径的流量I “实现:DFS函数有参量low,代表从源点到现在最窄的(剩余流量最⼩)的边的剩余流量,当DFS到汇点是,Low便是我们要的流量I对于反向弧(反向边)的理解:这⼀段不理解也不是不可以,对于会写算法没什么帮助,如果你着急,直接⽆视即可.先举⼀个例⼦(如右图):必须使⽤反向弧的流⽹络在这幅图中我们⾸先要增⼴1->2->4->6,这时可以获得⼀个容量为2的流,但是如果不建⽴4->2反向弧的话,则⽆法进⼀步增⼴,最终答案为2,显然是不对的,然⽽如果建⽴了反向弧4->2,则第⼆次能进⾏1->3->4->2->5->6的增⼴,最⼤流为3.Comzyh对反向弧的理解可以说是”偷梁换柱“,请仔细阅读:在上⾯的例⼦中,我们可以看出,最终结果是1->2->5->6和1->2->4->6和1->3->4->6.当增⼴完1->2->4->5(代号A)后,在增⼴1->3->4->2->5->6(代号B),相当于将经过节点2的A流从中截流1(总共是2)⾛2->5>6,⽽不⾛2->4>6了,同时B 流也从节点4截流出1(总共是1)⾛4->6⽽不是4->2->5->6,相当于AB流做加法.简单的说反向弧为今后提供反悔的机会,让前⾯不⾛这条路⽽⾛别的路.Alwa同学⾮要我给他的⽂章加⼀个链接,⼤家可以看看他的⽂章:。

最大流算法小结

最大流算法小结

网络最大流的算法网络最大流的算法分类:一、Ford-Fulkerson增广路方法1、Ford-Fulkerson标号算法(最简单的实现)分别记录这一轮扩展过程中的每个点的前驱与到该节点的增广最大流量,从源点开始扩展,每次选择一个点(必须保证已经扩展到这个点),检查与它连接的所有边,并进行扩展,直到扩展到t。

2、最大容量增广路算法每次找一条容量最大的增广路来增广,找的过程类似Dijkstra,实现起来相当简单。

3、Edmonds-Karp,最短路增广算法的BFS实现每次找一条最短的增广路,BFS是一个可以很方便的实现思想。

4、距离标号算法最短路增广的O(n)寻找实现,使用距离函数d:d[t]=0;d<=d[j]+1若存在(i,j)∈E;只有路径上满足d=d[i+1]+1的增广路才为满足要求的,一开始我们初始化使标号恰好满足要求,之后不断更改标号使其可以使增广继续。

5、Dinic,分层思想对网络分层(按照距t的距离),保留相邻层之间的边,然后运用一次类似于距离标号的方法(其实质是DFS)进行增广。

二、预留与推进算法1、一般性算法随便找个点,要么将他的盈余推出去,要么对他进行重标记,直至无活跃点为止。

2、重标记与前移算法维护一个队列,对一个点不断进行推进与重标记操作,直至其盈余为0,若过程中他没有被重标记过,则可出列,否则加入队头,继续等待检查。

3、最高标号预留与推进算法记录d值,然后优先处理d值较高的,直至没有盈余。

网络最大流的算法实现一、Edmonds-Karp(EK)算法就是用广度优先搜索来实现Ford-Fulkerson方法中对增广路径的计算,时间复杂度为O(VE2),Shortest Augmenting Path (SAP) 是每次寻找最短增广路的一类算法,Edmonds - Karp 算法以及后来著名的Dinic 算法都属于此。

SAP 类算法可统一描述如下:Shortest Augmenting Path{ x <-- 0while 在残量网络Gx 中存在增广路s ~> t do{ 找一条最短的增广路径Pdelta <-- min{rij:(i,j) 属于P}沿P 增广delta 大小的流量更新残量网络Gx}return x}在无权边的有向图中寻找最短路,最简单的方法就是广度优先搜索(BFS),E-K 算法就直接来源于此。

网络流学习笔记-最大流问题的四种算法

网络流学习笔记-最大流问题的四种算法

⽹络流学习笔记-最⼤流问题的四种算法最⼤流问题最⼤流问题满⾜以下三个条件:容量限制:f(u,v)≤c(u,v)斜对称性:f(u,v)=−f(v,u)流量平衡:∑(u,v)∈E f(u,v)=0(除s,t外的图中任意两点)原图中不存在的边也假设存在,视为容量为0.残量⽹络:计算出每条边上容量c与流量f之差后所得到的图。

由于上述的原因,边数可能是原图的两倍。

对于原图中⼀条c=16,f=11的单向边,在残量⽹络中对应边权为5(16−11)与11(0−(−11))的两条边。

增⼴路算法当且仅当残量⽹络中不存在s→t的有向道路(增⼴路)时,此时的流是从s到t的最⼤流。

Edmonds-Karp算法核⼼流程对图进⾏BFS,直到形成s−>t的通路(即当找到t时),同时维护这条通路上的最⼩残量minflow=e[i].cap−e[i].flow,并保存通路上每⼀个节点的⼊边。

只要能到达t,这条通路就是增⼴路,否则图中已经没有增⼴路。

形成通路之后,按照先前保留的各节点的⼊边,从终点t开始沿着通路倒退回去,并更新路上每⼀条边的正向边的流量e[i].flow与反向边的流量e[i^1].flow。

整条通路的流量更新完毕后,更新答案maxflow。

重复以上步骤,直到图中没有增⼴路。

优化⽅法重边处理。

即将正向边u→v的多条管道合并为⼀条,只需将cap属性累加即可。

⽽反向边不需要特殊处理。

(链式前向星+重边处理)int n, m, s, t;int num = 1;//让边的编号从2开始int head[maxn], pre[maxn];LL flow = 0;LL d[maxn];int flag[300][300];//记录重边,重边的容量累加到⼀条边上struct Edge {int next, to;LL cap;LL flow;}e[maxn*4];void addedge(int from,int to,LL cap){//存正向边num++;e[num].next = head[from];e[num].to = to;e[num].cap = cap;e[num].flow = 0;head[from] = num;//存反向边num++;e[num].next = head[to];e[num].to = from;e[num].cap = 0;e[num].flow = 0;head[to] = num;}void update() {//从终点开始退回去,沿路修改边权//通路的最⼩值m即d[t]for (int x = t; x != s; x = e[pre[x]^1].to) {e[pre[x]].flow += d[t];e[pre[x] ^ 1].flow -= d[t];}flow += d[t];}void ek(int s, int t) {for (;;) {mem(d, 0);//d[i]记录s->i路径上的最⼩残量//由于总是正数,可以同时起到记录是否访问过的作⽤queue<int> q;q.push(s);d[s] = INF;while (q.size()) {int u = q.front(); q.pop();for (int i = head[u]; i; i = e[i].next) {if (!d[e[i].to] && e[i].cap > e[i].flow) {pre[e[i].to] = i;//记录e[[i].to是从哪条边过来的d[e[i].to] = min(d[u], e[i].cap - e[i].flow);q.push(e[i].to);}}if (d[t]) break;//已经访问过t,可以跳出了}if (!d[t]) break;//整张图找遍依然到达不了t,说明已经没有增⼴路了update();}}int main() {cin >> n >> m >> s >> t;mem(flag, 0);f(i, 1, m) {int u, v, w;cin >> u >> v >> w;if (!flag[u][v]) {addedge(u, v, w);flag[u][v] = num - 1;//num是v->u的编号//num-1才是u->v的编号}else e[flag[u][v]].cap += w;//如果是重边,容量加到已存在的那条边上}ek(s,t);cout << flow;return 0;}Dinic算法EK算法中,每⼀次BFS都只能找到⼀条增⼴路,效率不⾼。

网络流算法的实现与应用

网络流算法的实现与应用

网络流算法的实现与应用网络流算法是图论中的一类重要算法,通过对网络中流的分配与调度来解决相关问题。

本文将探讨网络流算法的实现原理与应用场景。

一、网络流算法概述网络流算法主要处理的是“网络流”问题,即在一个图论模型中,寻找一种边的流动方式,使得源点到汇点的流量最大化或者达到某种要求。

常见的网络流算法包括最大流算法、最小割算法和最大权闭合子图算法等。

二、网络流算法的实现1. 最大流算法最大流算法旨在寻找网络中从源点到汇点的最大流量。

其中,最常用的算法是Edmonds-Karp算法,它是基于BFS(广度优先搜索)的增广路径寻找。

在实现过程中,可以使用图的邻接矩阵或邻接表来表示网络,利用算法的迭代思想不断寻找增广路径,并同时更新网络中的流量与残余容量,直到无法找到增广路径为止。

2. 最小割算法最小割算法用于求解网络中的最小割问题,即将网络分割为两个部分,使得切开的边的权值之和最小。

其中,Ford-Fulkerson算法是经典的最小割算法之一。

在实现过程中,可以通过DFS(深度优先搜索)或BFS寻找增广路径,并不断更新割与割集,直到最小割的权值无法再减小。

3. 最大权闭合子图算法最大权闭合子图算法用于求解有向图中的最大权闭合子图问题,其中闭合子图是指若干个节点的集合,对于任意一对节点u和v,如果存在一条从u到v的有向边,则u必定属于闭合子图中。

在实现过程中,可以使用Bellman-Ford算法来寻找最短路径,并通过路径上的正权重进行子图的扩展,最终得到最大权闭合子图。

三、网络流算法的应用网络流算法具有广泛的应用场景,以下介绍几个常见的应用领域:1. 传输网络规划网络流算法可以用于解决最大流问题,从而优化传输网络的规划。

例如,在通信网络中,可以通过最大流算法来确定最大传输容量,从而提高网络的传输效率。

2. 作业调度网络流算法可以用于解决作业调度问题,例如在工业生产中,通过最大流算法来确定最大的作业处理能力,从而提高生产效率。

网络流(二)最大流的增广路算法

网络流(二)最大流的增广路算法

⽹络流(⼆)最⼤流的增⼴路算法传送门:⽹络流的相关定义:源点:有n个点,有m条有向边,有⼀个点很特殊,只出不进,叫做源点。

汇点:另⼀个点也很特殊,只进不出,叫做汇点。

容量和流量:每条有向边上有两个量,容量和流量,从i到j的容量通常⽤c[i,j]表⽰,流量则通常是f[i,j].通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最⼤的车流量。

很显然的,流量<=容量。

⽽对于每个不是源点和汇点的点来说,可以类⽐的想象成没有存储功能的货物的中转站,所有“进⼊”他们的流量和等于所有从他本⾝“出去”的流量。

最⼤流:把源点⽐作⼯⼚的话,问题就是求从⼯⼚最⼤可以发出多少货物,是不⾄于超过道路的容量限制,也就是,最⼤流。

求解思路:⾸先,假如所有边上的流量都没有超过容量(不⼤于容量),那么就把这⼀组流量,或者说,这个流,称为⼀个可⾏流。

⼀个最简单的例⼦就是,零流,即所有的流量都是0的流。

(1).我们就从这个零流开始考虑,假如有这么⼀条路,这条路从源点开始⼀直⼀段⼀段的连到了汇点,并且,这条路上的每⼀段都满⾜流量<容量,注意,是严格的<,⽽不是<=。

(2).那么,我们⼀定能找到这条路上的每⼀段的(容量-流量)的值当中的最⼩值delta。

我们把这条路上每⼀段的流量都加上这个delta,⼀定可以保证这个流依然是可⾏流,这是显然的。

(3).这样我们就得到了⼀个更⼤的流,他的流量是之前的流量+delta,⽽这条路就叫做增⼴路。

我们不断地从起点开始寻找增⼴路,每次都对其进⾏增⼴,直到源点和汇点不连通,也就是找不到增⼴路为⽌。

(4).当找不到增⼴路的时候,当前的流量就是最⼤流,这个结论⾮常重要。

补充:(1).寻找增⼴路的时候我们可以简单的从源点开始做BFS,并不断修改这条路上的delta 量,直到找到源点或者找不到增⼴路。

(2).在程序实现的时候,我们通常只是⽤⼀个c 数组来记录容量,⽽不记录流量,当流量+delta 的时候,我们可以通过容量-delta 来实现,以⽅便程序的实现。

图论中的网络流最大流算法

图论中的网络流最大流算法

图论中的网络流最大流算法网络流最大流算法是图论中的重要算法之一,用于在一个网络中找到从源节点到汇节点的最大流量。

通过这个算法,可以解决很多实际问题,如网络传输、货物调度等。

本文将介绍网络流最大流算法的原理、应用场景以及具体实现方法。

一、算法原理网络流最大流算法基于图论中的流网络模型,它将待解决的问题建模成一个有向图,图中的节点表示网络中的顶点,边表示两个顶点之间的连接,并且每条边上有一个权值,代表该边的流量上限。

该模型中包括一个源节点和一个汇节点,算法的目标是找到一条从源节点到汇节点的路径,使得沿着这条路径的流量最大。

算法的基本思想是不断地寻找增广路径,并通过增加流量来提高路径的流量。

具体实现中,可以使用深度优先搜索或广度优先搜索来查找增广路径。

每次找到增广路径后,算法就会在路径上增加流量,并更新网络的容量。

通过不断寻找增广路径并增加流量,最终得到的流量即为网络的最大流。

二、应用场景网络流最大流算法可以解决很多实际问题,以下是几个常见的应用场景:1. 网络传输:在计算机网络中,经常需要确定网络中的最大可承载流量,以保证网络的正常运行。

网络流最大流算法可以帮助我们找到网络中数据传输的最大流量,并优化网络的传输效率。

2. 货物调度:在仓储物流管理中,需要确定货物从供应商到销售点的最佳路径,并保证货物的流动效率。

网络流最大流算法可以用来确定货物流动的最大流量,并提供最优的货物调度方案。

3. 交通规划:在城市交通规划中,需要确定交通网络中路段的最大容量,以保证道路的通行能力。

网络流最大流算法可以应用于交通规划中,帮助我们找到道路的最大容量,并优化交通流动。

三、具体实现方法网络流最大流算法有多种具体实现方法,其中最经典的算法是Ford-Fulkerson算法。

Ford-Fulkerson算法的基本思想是不断地寻找增广路径,并通过增加流量提高路径的流量。

算法的具体步骤如下:1. 初始化网络流为0。

2. 使用深度优先搜索或广度优先搜索找到一条增广路径。

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

• 复杂度:在一定基础上可达O(mn log n), 其中,n为点数、mple
• Dinic算法的Example
Fujishige algorithm
• 传说中的弱多项式算法
– 对简单有向图G以及整容量可在O(mnlog u max ) 时间内正确求解最大流问题,其中n为点数、 m为边数、u max为最大边容量(详见课本153)
– 2、活动点(active):除s、t外,流入>流出的 点(即超出量>0的点)
Push–relabel maximum flow algorithm (推流-重标算法)
• Definition:
– 3、距离标号(distance labels, or heights):
• a、h(s)=n,h(t)=0;(s和t的标号是固定的) • b、剩余图中的所有边(u,v),有h(u)<=h(v)+1;
Dinic's algorithm
• Definition:
– 阻塞流(blocking flow):
• 网络(G,u,s,t)对应的分层图中所有可扩路的并,即 为阻塞流
Dinic's algorithm
• 算法步骤:
– 1、令所有边的流量f=0; – 2、构造剩余图的分层图(level graph) – 3、在分层图中求一个阻塞的s-t流(the blocking flow)f',若f'=0,则止 – 4、用f'对f扩充,转2
Theorem
• 网络N(G,u,s,t)中的可行流f是N的最大流当 且仅当N中不存在f可扩路
– 必要性:若有可扩路P,沿P使f扩大即可 – 充分性:设网络中不存在可扩路
• 令S = {v∈V(G)|从源s到v有f可扩路}∪{s},则与最 大流最小割定理同样可证K' = (S,T)是网络中的一个 割,且value(f) = cap(K') • 设F为最大流,K为最小割,则value(f) <= value(F) <= cap(K) <= cap(K') • 故f即为最大流,K'即为最小割
Maximum Flow-Minimum Cut Theorem
• Definition:
– 1、s-t流:指满足如下条件的流:
• a、源点流出量>0 • b、除s、t点外,图G中的所有点流量守恒
– 注:此处的s-t流不单指图中特定的s-t路
• s-t流的值:源点s的流出量;
– 2、s-t割:即点集S指向点集T(此处T=V(G)\X)的边 集,其中s∈S且t∈T
– 证明:
• 1、任意一个流小于等于任意一个割(S,T),即value(F) <= cap(S,T) • 2、s∈S,t∈T当且仅当(S,T)中每条边的f都饱和,而(T,S)中每 条边的f都为零时上式取等 • 3、设F为网络的最大流,K为最小割,
– 则value(F) <= cap(K) – s∈S,t∈T;其中,令S = {v∈V(G)|从源s到v有f可扩路}∪{s}; – 则t∉S(否则存在s-t可扩路,可得到更大的流),从而K' = (S,T)是网络 中的一个割,故cap(K') >= cap(K); – 又可证(S,T)中每条边的f都饱和,而(T,S)中每条边的f都为零,故 value(F) = cap(K') >= cap(K) – 综上,value(F) = cap(K)
Fujishige algorithm
Fujishige algorithm
• 简单粗暴的说:
– 1、每一次迭代都从s出发(s即v1),按当前 的最大量(α)往t流
– a、只能往前流(v1—v2—v3......),若到达t点,转2 – b、若途经某边剩余容量<α,则缩减α(缩小一半向下取 整),然后重新迭代(在对应剩余图的基础上除了α啥也 没变)。注:若α=0,则终止
• 割的容量:各边容量之和 • 最小s-t割:在G中关于u具有最小容量的s-t割
Maximum Flow-Minimum Cut Theorem
• Definition:
Maximum Flow-Minimum Cut Theorem
• 任一个网络(G,u,s,t)中,最大流的流量等于最小 割的容量
– 4、容许(admissible)边:
• 剩余图中的边(u,v),且h(u)=h(v)+1;
Push–relabel maximum flow algorithm (推流-重标算法)
• 算法步骤:
– 1、令s的出边满流,其余边f=0(也可不置零) – 2、画出剩余图,令s的高度(height) h(s)=n,其余点h(v)=0 – 3、若有活动点,执行:
Ford–Fulkerson algorithm
• Definition:
– 3、一条f可扩路(the augmenting path):剩余 图中的一条s-t路 – 4、给定一个流f及剩余图中的一条路(或圈)P, 沿P使f扩充r:对每一个e∈E(P)
• 若e∈E(G),则令f(e)增加r; • 设e0∈E(G),若e为e0的反向边,则令f(e0)减小r
Network Flow
Presented by
Network Flow
• 基本性质:
– 对于网络(G,u,s,t)
• 1、容量限制(Capacity Constraints):F(x,y) <= C(x,y) • 2、流量守恒(Flow Conservation):ΣF(v,x) = ΣF(x,u) • 3、斜对称性(Skew Symmetry): F(x,y) = -F(y,x)
• Ford–Fulkerson算法的劣势:
Edmonds–Karp algorithm
-最大流问题的第一个多项式时间算法 – 与Ford–Fulkerson算法相比,改进之处在于第二步中P路 径的选择,与其任选,不如选最短(边数最少)
• 算法步骤:
– 1、令所有边的流量f=0; – 2、在 中找条最短可扩路P,若无,则止; – 3、算出P路中各边剩余容量的最小值r,并沿P 使f扩充r,转2;
– 注:此处的路径P不一定是可扩路
Ford–Fulkerson algorithm
• 输入:网络(G、u、s、t)及各边容量 • 输出:一条最大值的s-t流f • 算法描述:
– 1、初始时令所有边的流量f=0; – 2、求出剩余图(residual graph) ,并在 中找一条可扩路(the augmenting path)P。若 无可扩路,则终止; – 3、算出P路中各边剩余容量的最小值r,并沿P 使f扩充r,转2;
Gomory–Hu algorithm
• 未完待续
– to be continued
• 复杂度:
• Edmonds–Karp可在O(m*m*n)内得解
– Edmonds–Karp算法中无论边容量多大,最多增流m*n/2 次(m为边数,n为点数) – 每次增流用BFS最大为O(m)
Dinic's algorithm
• Definition:
– 分层图(level graph)
• 首先,分层图是基于剩余图的 • 其次,分层图会对所有顶点标号(与s的距离) • 最后,分层图中只存在这样的剩余边(u,v): dist(v)=dist(u)+1,不符合这一规律的边全部删去
• 设v为活动点:
– v点有容许边e,则push(e) – v点无容许边,则relabel(v)
– Push(e)
• 在v点的超出量e(v)与e的剩余容量中选出较小者r • 沿e使f扩充r
– Relabel(v)
• 在剩余图的(v,w)中找出高度最小的点w' • 令h(v)=h(w')+1
Push–relabel算法可在 O( n 2 m )时间内解决问题 (详见课本157)
• 讨论的前提:
– G为简单有向图 – 网络(G,u,s,t)中所有容量均为整数
• 最大流(max-flow)问题,就是求在满足网络流性质 的情况下,源点 s 到汇点 t 的最大流量。
Ford–Fulkerson algorithm
• Definition:
– 1、剩余图(residual graph): – 2、剩余容量(residual capacity):
– 2、从s出发的流成功到达t(假设为v6)
• 沿途经过的顶点按顺序为:s(v1)-v2-v3......t(v6) • 沿途经的边使流量f扩充α,得到新的剩余图,转1
Push–relabel maximum flow algorithm (推流-重标算法)
• Definition:
– 1、超出量(Flow Excess):流入-流出
相关文档
最新文档