我本来是只会EK的,就是那个最经典,也是最白痴的算法……(不过有些时候正经很好用呢~)
昨天和王正宇大牛在机房研究了一下神奇的SAP算法,今天又拿他做了一些网络流的题目,发现确实优化效果极其明显!
我在学的时候看的是DD_engi神牛的讲解。我这里简单总结一下:
首先我么先回顾一下EK(这个不会的可以看namiheike写的EK的详解,地址:http://www.oibh.org/bbs/thread-29333-1-1.html)。EK的思想就是每一次都用一个BFS来找到一条增广路,所以说我们就会发现他的复杂度是:O(V*E^2)。所以说我们找到的不一定就是最优的。
本人的总结能力有限,以下给出dd_engi神牛的讲解:
求最大流有一种经典的算法,就是每次找增广路时用BFS找,保证找到的增广路是弧数最少的,也就是所谓的Edmonds-Karp算法。可以证明的是在使用最短路增广时增广过程不超过V*E次,每次BFS的时间都是O(E),所以Edmonds-Karp的时间复杂度就是O(V*E^2)。
如果能让每次寻找增广路时的时间复杂度降下来,那么就能提高算法效率了,使用距离标号的最短增广路算法就是这样的。所谓距离标号,就是某个点到汇点的最少的弧的数量(另外一种距离标号是从源点到该点的最少的弧的数量,本质上没什么区别)。设点i的标号为D[i],那么如果将满足D[i]=D[j]+1的弧(i,j)叫做允许弧,且增广时只走允许弧,那么就可以达到“怎么走都是最短路”的效果。每个点的初始标号可以在一开始用一次从汇点沿所有反向边的BFS求出,实