【人人都要学算法】网络流算法远比你想的要好玩

原创 2015年11月17日 08:41:22

这个问题的由来是想起来明天将会有国足世预赛的比赛,于是今天去看了看国足目前在小组中的积分。在积分榜中,我们可以看到与中国同组的马尔代夫和不丹都已经没有了出线的机会,即使他们剩余的比赛全胜也不可能出线了。我在想,有没有一个通用的方法,可以算出各支队还有没有出现的可能。

image

====

现在我们来回归正题:

网络流(network-flows)是一种类比水流的解决问题方法,与线性规划密切相关。网络流的理论和应用在不断发展,出现了具有增益的流、多终端流、多商品流以及网络流的分解与合成等新课题。网络流的应用已遍及通讯、运输、电力、工程规划、任务分派、设备更新以及计算机辅助设计等众多领域。

其实网络流没有那么复杂,我们来用交通网示意图来举个例子:

image

我们来看这个交通网示意图,假设 S 为入口,T 为出口,图中的单向箭头表示从一个地方到另一个地方的可允许通过的方向,箭头上的数字表示该路线所能承载的最大的车流量(例如:a,b 两点,只能从 a 地到 b 地,并且该路线同时只能有4辆车同时通过)

我们需要解决的一个问题是如何安排好车的流量,例如现在有6辆车进入入口,我们可以如下图这样安排车的流量:

image

从图中我们可以看出来各个路线的最大承载量与当前的车流量,如上图的情况,我们说它是安全的。只要每一个地点它的驶入量与驶出量是相等的,我们就可以说它是安全的。另外,对于这个问题,我们会发现有的路线会是一个环(a->b->c->a),我们暂且不考虑这个问题,我们只关注当前的交通系统是安全的,至于有的车可能一直在绕圈圈我们不会去考虑。

现在又出现了一个新的问题:现在的交通实际车流量并没有达到最大,似乎还能增大 S 点的驶入量,这时我们可以再寻找一条从 S 到 T 的路经:S->a->b->c->T。把每条路径的实际流量加1,我们会发现情况依旧是安全的,此时的驶入量为7:

image

现在实际交通流量达到最大了吗?这次好像没有那么容易看出来了。我们来看一下这条路经:S->b->a->c->T,我们看到这条路经并不是完全顺着我们的路线的,只有 S->b 和 c->T 是顺着路线的,b->a 和 a->c 是逆着路线的。我们把顺着的路线流量都+1,把逆着的路线流量都-1,我们得到了下面的图:

image

此时,我们看这个图,它依旧是安全的,并且流量增加了1,现在驶入量是8。

现在我们得到了两种方式可以增大网络流流量的方法:

  • 从 S -> T 寻找一条路径,每一条的子路径的承载量都未满,我们可以通过该路径增加流量。
  • 从 S -> T 寻找一条路径,顺着方向的路径流量能+1(未满),逆着方向的路径流量能-1(非空),我们也可以通过该路径来增大流量。

我们把这两种路径叫做增广路径 ,如果我们不能在图中找到任何增广路径,那么我们就说它以及达到了最大流量。

====

现在,我们想想如何用网络流的模型来解决一支队是否有夺得第一名的可能。

现在我们来假设一种比赛,共有若干支队伍,互相之间要进行多场比赛,其中的5只队伍胜负情况如下表(其中 A 为联赛第一名,E 为联赛最后一名):

TEAM 剩余
A 75 59 28
B 72 62 28
C 69 66 27
D 60 75 27
E 49 86 27

剩余比赛的状况如下表:

TEAM A B C D E
A 0 3 8 7 3
B 3 0 2 7 4
C 8 2 0 0 0
D 7 7 0 0 0
E 3 4 0 0 0

我们现在考虑 E 队还有没有机会夺冠,也就是说在最好的情况下 E 能不能夺得第一名,即在剩下的比赛中 E 获得全胜。

现在我们考虑 E 如何才能夺得冠军,我们可以看到 E 还剩下27场比赛,如果它全胜的话,最后的胜局数量将会是49+27=76,那么也就是说,若使 E 保留夺冠可能,A 最多还能赢1场,B 最多还能赢4场,C 最多能赢7场,D 最多能赢16场

现在我们来看看赛程,A、B 直接还有3场比赛,A、C 之间还有8场比赛,A、D 之间还有7场比赛,B、C 之间还有2场比赛,B、D之间还有7场比赛

我们把上述情况总结成一个网络流图:

image

我们来解释下这一个图:

从 S 点出发的路线表示某两只队之间的剩余比赛数,到 T 点的路线表示某队最多能赢的场数。例如,我们设置了一个 A-B 结点,然后从 S 引出一条道路指向这个结点,并将其最大流量设定为 3 ;再从这个结点出发,引出两条道路,分别指向 A 和 B ,其最大流量可以均设为 3 ,或者任意比 3 大的值(一般设为无穷大,以表示无需限制)。因而,在一个网络流中,结点 A-B 将会从源点 S 处获得最多 3 个单位的流量,并将所得的流量再分给结点 A 和结点 B 。如果把每个单位的流量理解成一个一个的胜局,那么网络流也就可以理解为这些胜局的来源和去向。类似的我们有 A-B,A-C,A-D,B-C,B-D 五个结点。因此这个图中的任意一个合法的网络流都表示一种比赛结果

因此,现在如果我们能使该图的最大流量到达27,那么我们就可以合理的安排比赛,使得每支队伍都不超过所能允许的最多生理场次。

现在图中的最大流量是26,我们看看还能不能增加一个流量,即找到一个增广路径(图中 n 表示无穷大):

image

很显然,我们在图中找不到另外的增广路径了,因此该图的最大流量为26,因此,E 队不论多么努力,他们都将会与冠军无缘~


版权声明:本文为博主原创文章,未经博主允许不得转载。

文章来源:http://blog.luoyuanhang.com

版权声明:本文为博主原创文章,未经博主允许不得转载。(文章来源:http://blog.luoyuanhang.com)

网络流各种题型应用及解决方法

从浅到深,尽量每种题型都选出至少一道例题。
  • carryheart
  • carryheart
  • 2016年09月06日 16:21
  • 1343

网络流小结

网络流题目的重点往往是建模,算法大家学一段时间都能写出来,所以考察建模便成为了网络流题目的套路。 以下给出一些经典问题以及建模方法。 1.多源多汇问题。源点以及汇点都有多个。 建模:建立超级源点...
  • u013368721
  • u013368721
  • 2014年10月01日 11:12
  • 2331

网络流一般建模方式——最小割篇

前言:如果说网络流的难点在于建模,则最小割的难点还有一个——想到利用最小割,以及建出适用的最小割模型。一旦这两点搞定,就可以使用最小割=最大流定理解题了。 1,          直接使用定理 最...
  • CDQZOIERS
  • CDQZOIERS
  • 2016年12月23日 08:53
  • 993

最大流(网络流基础概念+三个算法)

下面是由一道题引发的一系列故事。。。 题目链接 http://poj.org/problem?id=1273 Drainage Ditches Time Limit: 1000MS M...
  • x_y_q_
  • x_y_q_
  • 2016年07月22日 21:12
  • 8831

网络流(理论详解)

   今天抽空看了看网络流最大流问题。了解了下基本概念和求解流程。这里简单总结下。 主要内容来自百度文库某ppt。在每幅图片的下面我会给出一些说明性文字。 本图示最大流的一个实...
  • mystery_guest
  • mystery_guest
  • 2016年07月14日 16:58
  • 7237

网络流之最大流算法(EdmondsKarp)

求网络流有很多算法,这几天学习了两种,记录一下EK算法。 首先是网络流中的一些定义: V表示整个图中的所有结点的集合. E表示整个图中所有边的集合. G = (V,E) ,表示整个图. s表...
  • y990041769
  • y990041769
  • 2014年03月11日 18:05
  • 76943

最大网络流算法

1、网络流基础 2、FF算法实现 3、 ff算法c++实现  1.流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负容量c(u,v)>=0。如果(u,...
  • jshayzf
  • jshayzf
  • 2013年03月23日 22:20
  • 3278

网络流算法整理

EK(EdmondsKarp)算法:这个算法改进于Ford-Fulkerson算法,Ford-Fulkerson算法是不断用广搜找一条增广路,然后判断一次这条路的最小流量,再对这条路增流,而EK与FF...
  • wangjian8006
  • wangjian8006
  • 2012年09月03日 20:57
  • 750

网络流:最大流,最小割 基本概念及算法

最大流、最小割定理(Maximum Flow, Minimum Cut Theorem):网络的最大流等于最小割。 We will assume that we are in the situatio...
  • xuzhezhaozhao
  • xuzhezhaozhao
  • 2014年03月25日 19:28
  • 21596

网络流解析——最大流EdmondsKarp算法

原理并不复杂,但存在的疑惑主要集中在反向边的引入,以下篇幅作以讲解。 首先假设一不存在TS边的单源有向加权图。 (所谓“TS边”即是指对于任一割,方向为T->S的边) 类似下图(1为S,6为T,...
  • crella___
  • crella___
  • 2017年03月31日 19:02
  • 552
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【人人都要学算法】网络流算法远比你想的要好玩
举报原因:
原因补充:

(最多只允许输入30个字)