网络流,这类算法,第一步就是理解概念
1.从概念开始
——百度百科
当你看到这段定义时,会感觉很难理解,有好多术语。
但其中还是有几句有用的。
网络流,就是一个有向图,它的每条边被称为弧。
每条弧有一个容量限制,我们后面再提。
这个算法有什么用呢?
举个例子,我们现在有许多水从总站出发,要运到最后的重点,中间有许多的中转站。
我们可以把水分成许多份,走许多不同的线路到达终点。
但是水在流动时,容量不能超过每根水管的限度,现在问你最多可以运多少水一次性到达终点。
一次性的含义是:水是在同时流动的。
网络流的最大流算法,就是来解决这个问题的。
2.算法思想及实现
网络流中最朴素的算法就是EK算法了。
这里我们要给出许多定义。
1)链
链就相当于有向图中路径的概念,但他们有不同。
有向图中的路径必须是相邻两个节点有正方向的边相连,但链只是一个顶点序列。
2)前向弧和后向弧
沿着链,与链正方向一致的弧称为前向弧,
与链正方向相反的弧称为后向弧
记链为P,则包含前向弧的集合为P+,包含后向弧的集合为P-
3)增广路
P+中的每一条弧均为占满容量上限
P-中的每一条弧流量均不为0
这样的链P称为增广路。
4)残量和残量网络
残量理解为弧中剩余的容量,残量网络就是残量的网络集合。
从残量网络的定义可以看出,原容量网络中的每条弧在残量网络中都化为一条或两条弧。
显然,只要残量网络中存在增广路,流量就可以增大。
可以证明它的逆命题也成立:如果残量网络中不存在增广路,则当前流就是最大流。这就是著名的增广路定理。
由增广路定理可以得出EK算法,它对整张图进行BFS,找到增广路后进行增广,复杂度为O(VE2)
代码请读者自行编写。
~~~continued~~~