▎写在前面

  FF算法传送门

  之前我们已经学过了FF算法(全称Ford-Fulkerson算法)来找最大流,但是这种算法仍有诸多不对的地方。

  其实这种算法存在着严重的效率的问题,请看下面的图:

  

  以这个图为例,我们使用的搜索是无规则选边的,可能第一次会选这样的一条边。

  

  那么我们继续增广。

  

  第二次我们可能会选这样一条边:

  

  

  发现什么了没有?边一直在减1,那么如果这样循环下去,的确有严重的效率问题。

  但是我们明明可以通过S -> 1 -> T或S -> 2 -> T就可以到达,且不存在效率问题,但是人眼能分辨出来,程序可不行,那么我们就应该请出EK算法了。

▎Edmonds-Karp算法

☞『定义』

  该算法与Ford-Fulkerson算法相同,只是定义了找到增广路径时的搜索顺序。 找到的路径必须是具有可用容量的最短路径。 这可以通过广度优先搜索找到,其中我们对每个边缘应用1的权重。 通过显示每个增强路径可以在O(E)时间内找到O(V E2)的运行时间,每次E边缘中的至少一个变得饱和(具有最大可能流量的边缘), 从增强路径到饱和边缘到源的距离必须比上次饱和的时间长,并且长度最多为V.该算法的另一个特性是最短增强路径的长度单调增加。 算法简介中有一个可访问的证明。(copy自百度)

☞『本质』
  其实说白了就是优先寻找最短路的FF算法。
▎算法高效性证明
☞『引理1』
引理:令fi表示增广i次后得到的容许流,λk(u,v)表示fk中u到v的一条最短路长度,那么就有:
  λk(S,v)≤λk+1(S,v),λk(v,T)≤λk+1(v,T)
证明:
假设fk+1中有一条从S到T的最短路为S=u0,u1,…,up-1,up=v,其中边记为e,ei表示(ui-1,ui)的长度,图解一下是这样的:

那么这是k+1次增广的结果,那么我们继续思考k次会是怎样的。

对于每一条边ei,都会有两种情况:

①在fk中也是可以使用的(没有用于此次增广),那么显然有λk(S,ui)≤λk(S,ui-1)+1;那么i与i-1有连边,所以可能等于,因为S到ui的最短路可能是从其他点绕过来的,所以可能是小于的;

②在fk中是不可以使用的(用于了增广),那么很显然λk(S,ui-1)=λk(S,ui)+1;这个不好讲,放张图自行体会吧。

综上,就有λk(S,v)≤λk+1(S,v)了。

☞『引理2』
引理:设边e在fk变为fk+1的增广路上,e´在fl变为fl+1的增广路上(k<l),那么就有:
λl(S,T)≥λk(S,T)+2
证明:假设e=(u,v),那么显然:
λk(S,v)=λk(S,u)+1
λl(S,T)=λl(S,u)+1+λl(u,T)
再由引理1替换得:
λl(S,T)≥λk(S,T)+2
 ☞『算法时间复杂度分析』
若边e在fk1,fk2,fk3,…中成为瓶颈(就是变化为0了),那么就必定存在fl1,fl2,fl3…,满足k1<l1<k2<l2<…,且e´在fli变为fli+1的增广路中。
就是说e在ki次增广时变成逆向的,在li次增广时变为正向的,这样ki+1次可以继续增广。
显然,S到T的最短路在1到n-1之间,其中n是总点数,每次改变e的方向,都会导致最短路长度加2(引理2)。
如果是第kj次增广,那么e变化的次数不可能超过2j-2次,就有:
2(2j-2)≤n-1-1(变化量小于上界减下界),把j单独移到一边去,就得到j≤(n+2)/4,由于一条边还有反向弧,所以一条边至多成为(n+2)/2次瓶颈,也就是说最多有m(n+2)/2条增广路。
这样,这个算法的时间复杂度就与权值无关了。

【算法•日更•第三十五期】FF算法优化:EK算法的更多相关文章

  1. 【算法•日更•第三十九期】迭代加深搜索:洛谷SP7579 YOKOF - Power Calculus 题解

    废话不多说,直接上题: SP7579 YOKOF - Power Calculus 题意翻译 (略过没有营养的题干) 题目大意: 给出正整数n,若只能使用乘法或除法,输出使x经过运算(自己乘或除自己, ...

  2. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解

    废话不多说,直接上题:  P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...

  3. 【算法•日更•第三十一期】KMP算法

    ▎前言 这次要讲的HMP算法KMP算法很简单,是用于处理字符串的,之前一直以为很难,其实也不过如此(说白了就是优化一下暴力). ▎处理的问题 通常处理的问题是这样的:给定两个字符串s1和s2,其中s1 ...

  4. 【算法•日更•第三十二期】教你用出windows体验的Linux

    ▎前言 小编昨天闲的不行,就装了一个linux系统,linux的发行版很多,小编认为ubuntu很好用,于是就在使用ubuntu. 没错,我现在就在使用ubuntu来写博客. 刚才还装了一个QQ,不过 ...

  5. 【算法•日更•第三十七期】A*寻路算法

    ▎写在前面 这是一种搜索算法,小编以前总是念成A乘寻路算法,没想到一直念错. 请大家都念成A星寻路算法,不要像小编一样丢人了. ▎A*寻路算法 ☞『引入』 相信大家都或多或少的玩过一些游戏吧,那么游戏 ...

  6. 【算法•日更•第四十二期】离散傅里叶变换(DFT)

    ▎前言 小编相当的菜,这篇博客难度稍高,所以有些可能不会带有证明,博客中更多的是定义. 我们将要学到的东西: 复数 暴力多项式乘法 DFT 当然,小编之前就已经写过一篇博客了,主要讲的就是基础多项式, ...

  7. 【算法•日更•第四十三期】QQ for linux

    废话不多说,直接看一张图: 没错,这是QQ,但是这有什么稀奇的?但是在Linux上使用QQ就很稀奇了. 众所周知,腾讯早就已经对Linux下的QQ和微信停止了服务,即便是网页版也不能用,通信这一直是小 ...

  8. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  9. 第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述

    第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述 我们的目标是对任 ...

随机推荐

  1. STL源码剖析:算法

    启 算法,问题之解法也 算法好坏的衡量标准:时间和空间,单位是对数.一次.二次.三次等 算法中处理的数据,输入方式都是左闭又开,类型就迭代器, 如:[first, last) STL中提供了很多算法, ...

  2. docker 入门教程(5)——总结与学习资料

    总结 registry:docker镜像仓库,集中存储和管理镜像,类似maven仓库. image:docker镜像,定义容器运行的文件和参数,可以看作是面向对象编程的类. container:doc ...

  3. 关于docker--详解安装,常规操作,导入导出等(2017-3-29)

    测试环境 :CentOS 7.1 64位 目的:展示docker的常规使用(安装,常规操作,导入导出等) 其他:关于原理等请参考文章后面的延伸阅读,本文不做深入探讨,且方法不唯一 0x01 关于安装d ...

  4. 【前端】H5,底边按钮吸边,但是覆盖了列表循环的内容

    我的说情况大致类似于: PS:因为底边那个模块 绝对是浮动的,所有会遮住列表最下面一条现实的一部分, 解决:这个时候把body的底边的内边距调整到可显示的就可以了: body { background ...

  5. WSGI应用程序示例

    import time # WSGI允许开发者自由搭配web框架和web服务器 def app(environ,start_response): status = '200 OK' response_ ...

  6. PHP array_uintersect_uassoc() 函数

    实例 比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回交集: <?phpfunction myfunction_key($a,$b){if ($a===$b){return 0;} ...

  7. PHP vsprintf() 函数

    实例 把格式化字符串写入变量中: <?php高佣联盟 www.cgewang.com$number = 9;$str = "Beijing";$txt = vsprintf( ...

  8. Linux分布式机器 设置机器名字

    查看主机的名字: hostname 1.临时修改 [root@localhost datas]# hostname slaver 临时修改,重启服务器后就不生效了 [root@localhost da ...

  9. 【HEOI2015】公约数数列 题解(分块)

    前言:毒瘤数据结构题,半个下午都在搞它了…… --------------------------- 题目链接 题目大意:给定一个长度为$n$的序列,有两种操作:1.把$a_x$的值改成$y$.2.求 ...

  10. Unity 入门