网络流1——最大流

网络流,这类算法,第一步就是理解概念

1.从概念开始

——百度百科

当你看到这段定义时,会感觉很难理解,有好多术语。

但其中还是有几句有用的。

网络流,就是一个有向图,它的每条边被称为弧。

每条弧有一个容量限制,我们后面再提。

这个算法有什么用呢?

举个例子,我们现在有许多水从总站出发,要运到最后的重点,中间有许多的中转站。

我们可以把水分成许多份,走许多不同的线路到达终点。

但是水在流动时,容量不能超过每根水管的限度,现在问你最多可以运多少水一次性到达终点。

一次性的含义是:水是在同时流动的。

网络流的最大流算法,就是来解决这个问题的。

2.算法思想及实现

网络流中最朴素的算法就是EK算法了。

这里我们要给出许多定义。

1)链

链就相当于有向图中路径的概念,但他们有不同。

有向图中的路径必须是相邻两个节点有正方向的边相连,但链只是一个顶点序列。

2)前向弧和后向弧

沿着链,与链正方向一致的弧称为前向弧

与链正方向相反的弧称为后向弧

 记链为P,则包含前向弧的集合为P+,包含后向弧的集合为P-

3)增广路

P+中的每一条弧均为占满容量上限

P-中的每一条弧流量均不为0

这样的链P称为增广路。

4)残量和残量网络

残量理解为弧中剩余的容量,残量网络就是残量的网络集合。

从残量网络的定义可以看出,原容量网络中的每条弧在残量网络中都化为一条或两条弧。

显然,只要残量网络中存在增广路,流量就可以增大。

可以证明它的逆命题也成立:如果残量网络中不存在增广路,则当前流就是最大流。这就是著名的增广路定理

由增广路定理可以得出EK算法,它对整张图进行BFS,找到增广路后进行增广,复杂度为O(VE2)

代码请读者自行编写。

~~~continued~~~

猜你喜欢

转载自www.cnblogs.com/Robin20050901/p/10353948.html