最大流模型为有N个湖(点),他们有小溪相连(边),每个小溪都有它们单位时间的最大流量,最大流求的是一个湖(源点)到另一个湖(汇点)单位时间内能流入的最大流量。
求最大流的一个算法为 ford_fulkerson算法,算法思想:
1.从源点开始寻找一条路径到汇点,记录这条路径流量最小的边的流量为m,然后最大流量+=m,然后每条边的流量都减去m,然后反向更新流量(每条边反方向的流量加上m);
2.重复步骤1直到找不到路径到汇点为止,最终的最大流量即为所求的最大流。
ford_fulkerson C++模板:
一个证明需要反向更新的例子:
这个图从1到6明显最的流量为3+3=6,但如果不用反向更新,由于用BFS首先找到一条路径1-2-3-6,然后1-2,2-3,3-6这几条边被更新成了0,就再也找不到增广路径到6了,而1-5-3的剩余的5个流量就无路可走了,用反向更新会再在3-2这里加一条流量为3的边,这时候1-5-3的5流量就可以通过这条边到2再到4再到6了,这就是反向更新的需要。
最大流题目:
POJ1273
最大流入门题,代码:
POJ 1459
这题关键是建图,为该图自建一个源点和汇点就行了。。
POJ 1149
灰常经典,无敌建图题,最大流必做题。
1.增加源点0与汇点t;
2.如果某顾客有某个猪圈的钥匙,如果之前有顾客有这个猪圈的钥匙,那么加一条之前那顾客到当前这个顾客的边,权值为无限大(方便剩下的猪能传递给当前的顾客),否则就在源点0与这个顾客加一条边,权值为这个猪圈的猪数目。还需要加一条该顾客到汇点t的边,权值为该顾客的需要猪的数量。
3.求源点0到汇点t的最大流