算法9-6:最大流的应用

最大流算法在现实生活中有着广泛的应用,从数据挖掘到图像处理,都有应用。现实生活中很多事物看起来是不相干的,而实际上只要通过数学建模,其实很多问题本质上都是一样的。

这里举的一些例子很多都是没办法第一眼就看出来,首先要理解最大流算法的模型,其次就是将现实生活中的问题转换成最大流问题从而进行求解。

二分图匹配问题

大学即将毕业了,很多童鞋要去找工作。现在有5个童鞋ABCDE,他们分别投了很多简历,录取情况如下:

  • 阿里录取了A B C
  • 腾讯录取了A B D E
  • 百度录取了C
  • 网易录取了A C
  • 新浪录取了D E

那么如何分配才能让所有的童鞋都有工作呢?

这就是二分图匹配问题。可以将公司和童鞋看成图论中的顶点,而录取情况看成边。这样,上述这个问题就变成了图论的问题。

那这个问题和最大流有什么联系呢?为了解决这个问题,需要增加两个辅助顶点,如下图所示。

这样,为了让最多的同学得到工作,实际上就是让这个网络的流量达到最大。因此,这个问题本质上就是最大流问题。最后求得的解是这样的。

棒球赛淘汰问题

问题描述:有多个球队之间进行棒球赛,使用的是循环赛制。每个球队目前的比赛状况如下表所示。问哪些球队有可能取得冠军?

这个问题换一种角度解释就是哪些球队已经不可能获得冠军。

解决这个问题时,将团队和团队之间的比赛看成图论中的顶点,场次作为边的容量。这样,这个问题就转换成最大流问题了。

研究现状

最大流问题可以说目前还没有找到一个性能非常好的算法。

下表展示了与最大流问题相关的算法名称以及复杂度。

从图中可以看出目前性能最好的算法复杂度是E^2/logE,还有很多的提升空间。理论上最小的复杂度是E。

上表展示的是最坏情况下的复杂度。现实生活中往往需要平均复杂度比较低的算法。实际应用中用的比较多的是Push-relabel算法,这种算法的复杂度是E sqrtE,具体实现方法参见wiki:http://en.wikipedia.org/wiki/Push%E2%80%93relabel_maximum_flow_algorithm

算法9-6:最大流的应用

时间: 2024-10-17 12:46:28

算法9-6:最大流的应用的相关文章

算法9-4:最大流算法复杂度分析

前面一节介绍了Ford-Fulkerson算法.那么这个算法是否一定能够在有限步骤内结束?要多少步骤呢? 这个问题的答案是,该算法确实能够在有限步骤之内结束,但是至于需要多少步骤,就要仔细分析. 为了分析问题,需要假定图中所有边的容量都是整数.但是有个严重的问题,比如下图中,如果使用Ford-Fulkerson算法,需要迭代200次才能结束. 首先将所有边的容量都初始化为0. 第一次迭代和第二次迭代之后,两条边各增加了1. 到最后200次迭代之后整个算法才结束. 这还不算最坏的情况.因为整数最多

算法9-5:最大流算法的Java代码

残留网络 在介绍最大流算法之前先介绍一下什么是残留网络.残余网络的概念有点类似于集合中的补集概念. 下图是残余网络的例子.上面的网络是原始网络,下面的网络是计算出的残留网络.残留网络的作用就是用来描述这个网络中还剩下多少可以利用的流量. 流量网络 最大流算法比以前介绍的算法都要复杂.网络中的每一条边需要记录容量和当前流量.容量是固定值,是已知条件,而当前流量在计算过程中会一直发生变化.因此,需要建立一个专门的类,用于最大流算法. public class FlowEdge { private i

算法9-1:最大流和最小切割问题

最小切割问题 首先介绍什么是切割.切割就是将一张图中的顶点分成两部分A和B. 接下来介绍一下什么是容量.容量是A区到B区所有的边权重之和. 最小切割就是求一张图中使得容量最小的切割方式. 最小切割的应用 最小切割在国家的拆分时会用到.著名的苏联解体事件就是通过计算最小切割来实现国家的拆分.在建模的时候将城市作为图论中的顶点,将铁路作为顶点之间的边.最后通过计算最小切割来界定国家界线. 最大流问题 最大流就是从顶点s到顶点t,经过所有的边,网络所能支撑的最大流量.下图中顶点t从三个方向接收流量,它

算法9-2:最大流Ford-Fulkerson算法

本节介绍最大流算法的基本思想. 首先将整个网络的最大容量都设为0. 然后增加第一条边的流量,达到最大流量. 增加第二条边的流量,达到最大流量. 增加第三条边的流量,达到最大流量.这里需要注意的是,图中有一条反向的边(称之为后向弧).后向弧的作用就是说,可以将后向弧中的流量移动到别的线路中,这样可以增加更多的流量. 同样的,在第四条边中也有反向弧,通过反向弧增加更多的流量. 算法结束的依据是判断所有的路径都达到下列任意条件: 容量已经满了 反向弧是空的 这就是Ford-Fulkerson算法的基本

算法9-3:最大流和最小切割的理论

本章节介绍最大流问题和最小切割问题的关系.其实这两个问题是等价的. 现在把一个网络分成A和B两个部分,我们定义A到B的净流量交叉(Net flow across)就是从A到B的最大流量减去从B到A的最大流量. 接下来介绍流量值定理(Flow-value lemma).令f为网络中任何一个流,令(A,B)为网络的任何一种切割方法,那么(A,B)的净流量交叉就等同于f的流量值.下图展示了流量值定理. 通俗的解释一下吧.首先将网络切割两个部分A和B,那么AB之间的流量就是从A到B的总流量减去从B到A的

POJ 2112 Optimal Milking 最优挤奶方案 Floyd算法+二分查找+最大流

题目链接:POJ 2112 Optimal Milking Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12446   Accepted: 4494 Case Time Limit: 1000MS Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among

【算法】网络最大流 Dinic

Dinic的大体思路是和EK差不多的(其实很多算法的大体思路都一样),只不过Dinic在每次寻找增广路时先bfs一下,给每个点都加上一个等级,而规定:只有等级相邻的两个点之间才能走,那么在dfs时就会减掉很多无用因此不必要的道路 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using na

【算法】网络最大流 EK

网络流是干嘛的?举一个例子: 在一个水上城市中,有很多小镇,之间有很多座桥连着,每一座桥因为制作材料不同最大载重不同,如果超过最大载重,桥就垮了,桥上的人就GG了,所以我们不能让这样的情况发生——即:每一条边的流量不能超过容量,我们再规定一个起点,一个终点,我们要从起点运货到终点,只有一次机会但可以同时走多条道路充分利用资源,最后求:最大运货量可以为多少? 这就是网络最大流问题,求某点到某点的最大流量. EK算法,网络流最朴素的算法,不断寻找增广路,再来回两遍减容量,加ans,容易理解: 1 #

hdu 3488(KM算法||最小费用最大流)

Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 2925    Accepted Submission(s): 1407 Problem Description In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000