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也被一正一反抵消掉了。
以及,每次选那条路径的顺序并没有所谓,只要最后所有路径的和等于最大流就行了,所以就可以在搜索中反复反悔。
EK算法可以在O(V*E^2)的时间复杂度内找到最大流。该算法通过不断对残量网络进行从源点s到汇点t的广度优先搜索(BFS),找到增广路径并更新残量网络。此外,通过引入反向边的概念,在更新路径时同时调整正向与反向边的容量,确保算法能够正确处理复杂的流量分配问题。
1212

被折叠的 条评论
为什么被折叠?



