网络流——最大流与最小割
最大流
先看一道题(选自usaco题库4.2.1):
【USACO题库】4.2.1 Drainage Ditches草地排水
时间限制: 1000 ms 空间限制: 128000 KB 具体限制
题目描述
在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水。这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间。因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪)。作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量。
农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小溪的一张网)。需要注意的是,有些时候从一处到另一处不只有一条排水沟。
根据这些信息,计算从水潭排水到小溪的最大流量。对于给出的每条排水沟,雨水只能沿着一个方向流动,注意可能会出现雨水环形流动的情形。
输入
第1行: 两个用空格分开的整数N (0 <= N <= 500000) 和 M (2 <= M <= 1000)。N是农夫约翰已经挖好的排水沟的数量,M是排水沟交叉点的数量。交点1是水潭,交点M是小溪。
第二行到第N+1行: 每行有三个整数,Si, Ei, 和 Ci。Si 和 Ei (1 <= Si, Ei <= M) 指明排水沟两端的交点,雨水从Si 流向Ei。Ci (0 <= Ci <= 10,000,000)是这条排水沟的最大容量。
输出
输出一个整数,即排水的最大流量。
样例输入
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
样例输出
50
数据范围限制
N (0 <= N <= 500000)
M (2 <= M <= 1000)
这道题看了看,发现用之前所学的算法都没有什么思路,那么,我们现在就引进一种新的算法:网络流。而网络流又分为很多种:最大流,最小割,费用流等,这一道题用的是最大流。
何为最大流?
抽象地讲是给你一个网络,有一个源点和汇点,现在要从源点放水,水从一条边流到另一个点,但最多只能流一个值的水,下一个点又这样流向另一个点,问汇点最多会流入多少水?
知道了这些,我们就了解一些概念:
概念
-
- 剩余图
- 给定一个流量网络 G1=(E1,V1) 源点s汇点t、容量函数为c(u,v)以及其上的流量函数f(u,v)。那么定义剩余图 G2=(E2,V2) :剩余图中的点集与流量网络中的点集相同,即 V1=V2 ,对于流量网络中的任一条边 (u,v)∈E1 若 f(u,v)<c(u,v) 则 (u,v)∈E2 这条边在剩余图中的权值为 g(u,v)=c(u,v)−f(u,v) ,同时,若 f(u,v)>0 则 (v,u)∈E2 且 g(v,u)=f(u,v) 。
- 我们可以发现,流量网络中的每条边在剩余图中都化作一条或二条边。剩余图中的每条边都表示在原流量网络中能沿其方向增广。剩余图的权值函数 g(u,v) 表示在流量网络中能够沿着u到v 的方向增广大小为 g(u,v) 的流量。所以在剩余图中,从源点到汇点的任意一条简单路径都对应着一条增广路,路径上每条边的权值的最小值即为能够一次增广的最大流量。
-
- 顶点的层次
- 在剩余图中,我们把从源点到点u的最短路径长度称作点u的层次,记为 level(u) 。源点的层次为0。在下面这张剩余图中:
- 每个点旁边的数字即表示该点在图中的层次。
-
- 层次图的概念
- 我们这样定义层次图 G3=(E3,V