ek算法能在o(v*e^2)时间里求出最大流
思路:每一步对残量网络进行一次s到t的bfs,以这次bfs的结果作为增广路,更新残量网络。用bfs找增广路可以避免回头的情况。
也可以用dfs搜,只要能搜出来条路就行
但是光这样还不行
考虑这样一个情况
为方便,令每条边上的权值为1
如果直接搜的话,会搜成这样
第一次搜的是红的那条,第二次搜的是蓝的那条。可以看到第二次就停了,得到的流量就只有1,但是显然这个图的流量是2。
ek的另一个操作就是反向边,每次更新路径时,正向路径的权值减去本次流量,反向权值加上这次流量
这样的话第一次搜索完以后图就变成了这样
红色是更新的边,原来的边因为权值没了所有去除。蓝色是第二次搜索的路径。
为啥这么操作可行呢
这个操作相当于是一种“反悔”操作,显然如果直接构造两条正确的路径就是1-2-5-6和1-3-4-6,这两个里面都没有2-4,在上面的操作中2-4也被一正一反抵消掉了。
以及,每次选那条路径的顺序并没有所谓,只要最后所有路径的和等于最大流就行了,所以就可以在搜索中反复反悔。