【算法•日更•第三十五期】FF算法优化:EK算法
▎写在前面
之前我们已经学过了FF算法(全称Ford-Fulkerson算法)来找最大流,但是这种算法仍有诸多不对的地方。
其实这种算法存在着严重的效率的问题,请看下面的图:
以这个图为例,我们使用的搜索是无规则选边的,可能第一次会选这样的一条边。
那么我们继续增广。
第二次我们可能会选这样一条边:
发现什么了没有?边一直在减1,那么如果这样循环下去,的确有严重的效率问题。
但是我们明明可以通过S -> 1 -> T或S -> 2 -> T就可以到达,且不存在效率问题,但是人眼能分辨出来,程序可不行,那么我们就应该请出EK算法了。
▎Edmonds-Karp算法
☞『定义』
该算法与Ford-Fulkerson算法相同,只是定义了找到增广路径时的搜索顺序。 找到的路径必须是具有可用容量的最短路径。 这可以通过广度优先搜索找到,其中我们对每个边缘应用1的权重。 通过显示每个增强路径可以在O(E)时间内找到O(V E2)的运行时间,每次E边缘中的至少一个变得饱和(具有最大可能流量的边缘), 从增强路径到饱和边缘到源的距离必须比上次饱和的时间长,并且长度最多为V.该算法的另一个特性是最短增强路径的长度单调增加。 算法简介中有一个可访问的证明。(copy自百度)
引理:令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)了。
引理:设边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算法的更多相关文章
- 【算法•日更•第三十九期】迭代加深搜索:洛谷SP7579 YOKOF - Power Calculus 题解
废话不多说,直接上题: SP7579 YOKOF - Power Calculus 题意翻译 (略过没有营养的题干) 题目大意: 给出正整数n,若只能使用乘法或除法,输出使x经过运算(自己乘或除自己, ...
- 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
废话不多说,直接上题: P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...
- 【算法•日更•第三十一期】KMP算法
▎前言 这次要讲的HMP算法KMP算法很简单,是用于处理字符串的,之前一直以为很难,其实也不过如此(说白了就是优化一下暴力). ▎处理的问题 通常处理的问题是这样的:给定两个字符串s1和s2,其中s1 ...
- 【算法•日更•第三十二期】教你用出windows体验的Linux
▎前言 小编昨天闲的不行,就装了一个linux系统,linux的发行版很多,小编认为ubuntu很好用,于是就在使用ubuntu. 没错,我现在就在使用ubuntu来写博客. 刚才还装了一个QQ,不过 ...
- 【算法•日更•第三十七期】A*寻路算法
▎写在前面 这是一种搜索算法,小编以前总是念成A乘寻路算法,没想到一直念错. 请大家都念成A星寻路算法,不要像小编一样丢人了. ▎A*寻路算法 ☞『引入』 相信大家都或多或少的玩过一些游戏吧,那么游戏 ...
- 【算法•日更•第四十二期】离散傅里叶变换(DFT)
▎前言 小编相当的菜,这篇博客难度稍高,所以有些可能不会带有证明,博客中更多的是定义. 我们将要学到的东西: 复数 暴力多项式乘法 DFT 当然,小编之前就已经写过一篇博客了,主要讲的就是基础多项式, ...
- 【算法•日更•第四十三期】QQ for linux
废话不多说,直接看一张图: 没错,这是QQ,但是这有什么稀奇的?但是在Linux上使用QQ就很稀奇了. 众所周知,腾讯早就已经对Linux下的QQ和微信停止了服务,即便是网页版也不能用,通信这一直是小 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- 第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述
第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述 我们的目标是对任 ...
随机推荐
- vue学习(十七) 使用自定义指令 使文本框获得鼠标焦点
需求:当我们进入某个页面,页面中的第一个input会自动获得焦点 光标闪烁,代表可输入 <div id="app"> //v-focus 是自定义的 <input ...
- ES模糊查询来对应mysql的like查询
使用ES查询来对应mysql的like查询 建立一个测试索引 PUT /test_like1 { "mappings" : { "properties" : { ...
- git chechout
在克隆完一个的版本库时,git会在本地创建一个master分支用于跟踪远端的master分支 如git clone abc.git 默认情况下git会在本地创建一个master分支 但是,在本地mas ...
- cpp求职
//Created by Arc on 2020/5/23 //////// Created by snnnow on 2020/5/20.//////面向对象的程序设计-期中测试// 根据题目实现求 ...
- three.js之初探骨骼动画
今后的几篇郭先生主要说说three.js骨骼动画.three.js骨骼动画十分有意思,但是对于初学者来说,学起来要稍微困难一些,官方文档比较少,网上除了用圆柱体的例子就是引用外部模型的,想要熟练使用骨 ...
- Python time strftime()方法
描述 Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定.高佣联盟 www.cgewang.com 语法 strftime( ...
- PHP localtime() 函数
------------恢复内容开始------------ 实例 以一个数值数组和一个关联数组的形式输出本地时间: <?phpprint_r(localtime());echo "& ...
- PDOStatement::getColumnMeta
PDOStatement::getColumnMeta — 返回结果集中一列的元数据(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang. ...
- Linux搭建Gitlab(Docker版)
1.拉取gitlab的docker镜像 #这里使用gitlab的社区版 docker pull gitlab/gitlab-ce 2.启动gitlab容器实例 docker run -d -p 44 ...
- LeetCode 87,远看是字符串其实是搜索,你能做出来吗?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第54篇文章,我们一起来看LeetCode 87题,Scramble String(爬行字符串). 这题的官方难度 ...