edmonds-karp算法求最大流

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也被一正一反抵消掉了。

以及,每次选那条路径的顺序并没有所谓,只要最后所有路径的和等于最大流就行了,所以就可以在搜索中反复反悔。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值