• 【算法•日更•第三十五期】FF算法优化:EK算法


    ▎写在前面

      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条增广路。
    这样,这个算法的时间复杂度就与权值无关了。
  • 相关阅读:
    第11组 团队Git现场编程实战
    第11组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    第11组 团队展示
    第一次结对编程作业
    Nginx学习笔记
    Git学习笔记
    Qt学习笔记
    Eclipse中Outline里各种图标的含义
  • 原文地址:https://www.cnblogs.com/TFLS-gzr/p/11310037.html
Copyright © 2020-2023  润新知