《算法导论》笔记(18) 最大流 含部分习题

《算法导论》笔记 专栏收录该内容
18 篇文章 0 订阅

流网络,容量值,源结点,汇点,容量限制,流量守恒。反平行,超级源结点,超级汇点。

Ford-Fulkerson方法。残存网络,增广路径,最小切割定理。f是最大流,残存网络不包含增广路径,|f|等于最小切割容量三者等价。

基本的Ford-Fulkerson算法。Edmonds-Karp算法。为了算法的收敛性。残存网络中用广度优先寻找增广路径。证明运行时间为O(V*E^2):对特定一条边,其成为关键边的次数最多为V/2,残存网络最多有O(E)种可能的关键边,每条增广路径至少一条关键边,则关键边的总数为O(VE),广度优先搜索的每次迭代代价是O(E),则总时间为O(V*E^2)。

最大二分匹配。

推送-重贴标签算法。由源点向外流动,初始化时用最大流量将与源点直接相连的结点充满超额流,然后重贴高度标签,升高有残余网络的溢出结点的高度,使超额流量向高度低的结点扩散,如此反复执行溢出与标签操作,直至所有除源点与汇点外的结点都无超额流。则得到最大流。

习题26.1-4 标量流积问题,证明流为凸集。对于任意的流f1及f2,假设f3= f1*a+f2*(1- a)。首先f3要满足流量守恒,∑f(u, v)= ∑f(v, u),易知f3满足流量守恒。其次要满足容量限制。f3= f2+ a*(f1- f2),f3<= max(f1, f2),则f3(u, v)<=c(u, v)。则f3也是一个流。

习题26.1-5 最大流问题表述为线性规划问题。f(u, v)为u到v路径上的流量,各项有最大值c,f(u, v)<= c(u, v),各结点流量守恒,∑f(u, v)= ∑f(v, u)。变换为一组方程组。

习题26.1-7 结点容量问题。一个结点分割为两个结点,彼此之间的最大流量设定为结点容量即可。

习题26.2-6 设置超级源点与超级汇点。超级源点到每个源结点的路径最大容量是pi,而每个汇点到超级汇点的路径最大容量是qi。

习题26.2-11 最大流算法确定无向图的边连通性。因为最大流等于最小切割容量,设置所有边容量为1,最大流为n,则源点与汇点之间最少有n条通路,需要删除n条边才能保证图不连通。找到一个结点与其余每个结点间最大流,则最大流的最大值就是连通值。

习题26.2-12 因为f(v, s)= 1,根据流量守恒,f中一定有另外一条路径由s到v,残存网络有一条至少容量为1由s经过v回到s的路径。则存在f',将此路径与f叠加,使得f‘中v到s流量为0. 找到此路径的方法是在残存网络中用BFS算法寻找v到s容量至少为1的路径。

习题26.4-4 快速算法找到最小切割。残存网络的边与最大流量大小相当方向相反,则分别放入最小切割的两侧,然后分别向源点与汇点追溯,各自加入两个集合。

习题26.4-8 证明Generic-push-relabel算法维持u.h < |V|意味着u.h <= δf(u, t),维持u.h>=|V|意味着u.h-|V| <= δf(u, s)。因为残存网络中u到v的距离为δf(u, v),则可知u.h <= v.h+δf(u, v)。若维持u.h < |V|,又有t.h=0,则结点u满足u.h <= δf(u, t)。若维持u.h >= |V|,又有s.h = |V|,则满足u.h - |V| <= δf(u, s)。

思考题26-1 逃逸问题。证明在结点和边都有容量的流网络中确定最大流的问题可以规约为同等规模网络中的普通最大流问题。每个结点前放置一个结点,结点对设定为一个只能进,一个只能出,此二结点之间流量限制为结点容量,则与原问题等价。解决逃逸问题也是同理。每个结点增加一个伴随结点,一只能进一只能出,结点之间容量为1,可按照一般的最大流算法解。

思考题26-2 最小路径覆盖问题。假定V={1, 2, ... n},构建图G'=(V', E'),其中V'= {x0, x1, ... xn} ∪ {y0, y1, ... yn},E'= { (x0, xi) } ∪ { (yi, y0) } ∪ { (xi, yj) },所有边容量为1。在图中运行最大流算法,得到由源点x0的直接流入点 Vin = {xi: (x0, xi)在最大流中},与汇点y0的直接流出点 Vout = {yj: (yj, y0)在最大流中},两个集合的元素数量应该相等,并且等于最小路径覆盖的数量,在最大流中从Vin出发,按照深度遍历到达Vout,得到全部路径。带环路的情况则需要修改算法,Vin与Vout的数量不等于最小路径覆盖的数量,而是需要从Vin出发深度遍历到达Vout,统计出全部路径。

思考题26-3 算法咨询。对于有限容量的切割(S, T),有Ji ∈ T,则对于每个结点Ak ∈ Ri,有Ak ∈ T。令Ay集合表示聘请专家的子领域,An集合表示不聘请,Jy集合表示接受的工作,Jn集合表示不接受的工作。则∑Py - ∑Cy为利润。在图中,最小切割的容量不可能包含有A到J边,因为这些边的容量都是无穷大。故属于同一子集的A与J必然在切割的同一边。因为∑Py - ∑Cy是利润,而∑Py =∑P - ∑Pn,可知利率最大时,∑Cy + ∑Pn为最小。也恰好是最小切割容量。根据最大流最小切割定理,用S到T的最大流算法可以解决。用全部工作的总营收值∑P 减去最小切割容量,即可得到最大利润。

  • 0
    点赞
  • 4
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 4 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

nklofy

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值