首页 > 编程语言 > 详细

EK算法

时间:2020-08-20 16:26:39      阅读:62      评论:0      收藏:0      [点我收藏+]

前言:Rothen is the strongest man

优秀而快乐的E-K算法

时间复杂度:O(nm^2),一般跑不满,所以可以处理1e3 ~ 1e4的网络

基本流程:

1.找到一条还有剩余流量的路,找到一条弧使得它的容量与其当前流量的差最小 ,也就是剩余的流量最小的一条边,那么对于这条路,我们把所有路径上的弧都加上这个最小值,这是一定可行的!操作后,这条边的流量就为现在的流量+最小差 (另外注意,当此条路中弧的剩余流量减少时,一定要增加其反向图的流量,因为f(x,y)=-f(y,x))

2.重复以上步骤直到找不到增广路(我这步骤二要跟不要有什么区别??由此看出其实E-K算法就是愉快的暴力求解,快乐就完事了!!)

注意事项:

1.添加反向边

2.将反向边的剩余流量一开始设置成零

3.记得每次将原图中的流量减去的时候一定要增加反向边的剩余流量!

Code

网络流入门参考,我觉得讲的很好啊

EK算法运用:

1.二分图最大匹配

这道题目是一个经典建模,首先源点连接所有的一部图,汇点连接所有的二部图, 然后把每条边的容量设置成1(显然是正确的,因为每次匹配后那一条边肯定不能再次使用了嘛)然愉快跑一边EK就过了

噫!好!双倍经验

Code

最小费用最大流

这东西直接把EK算法的BFS换成SPFA就行了,

注意细节

1.我采用了一种奇怪的存边方式,就是把边按起点排序,然后同时要维护其反向边的序号,于是我就给每一条边一个num,num相同的就是互为反向边的边,然后用一个桶存一下,搞个nxt记录反向边的序号,就可以了

2.每次updata一定要注意反向边!!!

3.waste 必须要赋值为当前waste 的相反数!f(x,y)=-f(y,x)!

4.要记住存一下前驱边(便于updata)

5.SPFA的时候判断现在这条边的剩余流量是否为0

Code

EK算法

原文:https://www.cnblogs.com/MYCui/p/13534940.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!