• 最大流学习笔记(2)


    上一篇

    1 基本的Ford-Fulkerson方法。该方法的思想就是每次找到一个增广路$p$,然后将增广路 $p$对应的流加到之前的流上得到新的流,一直这样直到找不到增广路,这时候找到的流就是最大流。

    算法的伪代码如下

    假设容量是整数,最大流为$f^{*}$,那么while循环最多执行$|f^{*}|$次,因为每次至少使得流量增加1,每次找增光路的代价是$O(E)$,所以总的复杂度是$O(E|f^{*}|)$

    2 Edmonds-Karp算法。Edmonds-Karp算法是对Ford-Fulkerson的改进,具体就是每次找增广路时找的是s到t的最短路(路径边长为1)。设$delta_{f}(u,v)$表示残存网络中从$u$到$v$的最短路径

    3 如果Edmonds-Karp算法运行在流网络G上,那么对所有的节点$vin V-{s,t}$,残存网络$G_{f}$中的最短路径距离$delta_{f}(s,v)$随着每次流量的递增而单调递增。

    4 如果Edmonds-Karp算法运行在流网络G上,则该算法所执行的流量递增的总次数为$O(VE)$

    5 Edmonds-Karp算法每次找最短路径的复杂度是$O(E)$,所以总的复杂度是$O(VE^{2})$

    以下为证明

    3的证明

    假设对于某个节点$vin V-{s,t}$,存在一个流量递增的操作使得源点到$v$的距离变小了。设$f$是最短路径减少之前的流量,对应的残存网络为$G_{f}$,$f^{'}$是递增之后的流量,对应的残存网络为$G_{f^{'}}$,设$v$为在所有最短距离减少的节点中,$delta_{f^{'}}(s,v)$最小的节点。有$delta_{f^{'}}(s,v)<delta_{f}(s,v)$。

    设$p=ssim u ightarrow v$为残存网络$G_{f^{'}}$中从源节点s到$v$的一条最短路径,因此$(u,v)in G_{f^{'}}$,并且$delta_{f^{'}}(s,u)=delta_{f^{'}}(s,v)-1$

    源节点到$u$的距离没有减少,所以$delta_{f^{'}}(s,u)geq delta_{f}(s,u)$

    那么一定有$(u,v) otin E_{f}$,否则:

    $delta_{f}(s,v)leq delta_{f}(s,u)+1$

    $leq delta_{f^{'}}(s,u)+1$

    $=delta_{f^{'}}(s,v)$

    这与$delta_{f^{'}}(s,v)<delta_{f}(s,v)$矛盾。

    那么现在$(u,v) otin E_{f}$但是$(u,v)in E_{f^{'}}$,这一递增操作一定是增加了$v$到$u$的流量。又因为Edmonds-Karp算法总是沿着最短路径增加流,所以在$G_{f}$中从s到$u$的最短路径上的最后一条边是$(v,u)$,所以

    $delta_{f}(s,v)=delta_{f}(s,u)-1$

    $leq delta_{f^{'}}(s,u)-1$

    $=delta_{f^{'}}(s,v)-2$

    这与$delta_{f^{'}}(s,v)<delta_{f}(s,v)$矛盾。所以一开始的假设是不正确的。

    4的证明

    在$G_{f}$中,如果一条路径$p$的残存容量是该路径上的边$(u,v)$的残存容量,即$c_{f}(p)=c_{f}(u,v)$,那么我们称$(u,v)$为关键边。下面首先证明对于每条边来说,成为关建边的次数最多为$frac{|V|}{2}$

    当$(u,v)$第一次成为关键边时有$delta_{f}(s,v)=delta_{f}(s,u)+1$

    之后边$(u,v)$将从残存网络中消失。到下一次$(u,v)$成为关键边时,一定在之前$(v,u)$出现在了路径$p$上,假设这一事件发生时$f^{'}$是G的流,那么有

    $delta_{f^{'}}(s,u)=delta_{f^{'}}(s,v)+1$

    由于$delta_{f}(s,v)leq delta_{f^{'}}(s,v)$

    那么有$delta_{f^{'}}(s,u)=delta_{f^{'}}(s,v)+1geq delta_{f}(s,v)+1=delta_{f}(s,u)+2$,也就是到$u$的距离增加了至少2

    初始时到$u$的距离至少为0,最后到$u$的距离最多为$|V|-2$($(u,v)$出现在增广路径上意味着$u eq t$,同时$u eq s$).所以在$(u,v)$第一次成为关建边后还最多能成为$frac{|V|-2}{2}=frac{|V|}{2}-1$次关建边,所以一共最多成为$frac{|V|}{2}$次关建边。

    一共有$|E|$条边,所以一共有最多$frac{|V||E|}{2}$条关建边,每条增广路至少出现一条关建边,所以总次数为$O(VE)$

    下一篇

  • 相关阅读:
    Codeforces 17.E Palisection
    poj4052 Hrinity
    bzoj2565 最长双回文串
    Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历
    Java基础知识强化之集合框架笔记42:Set集合之LinkedHashSet的概述和使用
    Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
    Java基础知识强化之集合框架笔记40:Set集合之HashSet存储自定义对象并遍历
    TCP/IP协议原理与应用笔记13:底层网络技术之传输介质
    Java基础知识强化之集合框架笔记39:Set集合之HashSet存储字符串并遍历
    Java基础知识强化之集合框架笔记38:Set集合之Set集合概述和特点
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/6010588.html
Copyright © 2020-2023  润新知