• 最大流学习笔记(3)-推送重贴标签算法一


    上一篇

    1 预流:预流是一个$V imes V ightarrow  R$的函数$f$,该函数对于每个节点$uin V-{s}$满足容量限制条件和下面的性质:

    $sum_{vin V}f(v,u)-sum_{vin V}f(u,v)geq 0$

    定义$e(u)=sum_{vin V}f(v,u)-sum_{vin V}f(u,v)$为进入节点$u$的超额流。如果$e(u)>0$,称$u$溢出

    2 高度函数的定义:设G是一个流网络,如果函数$f:V ightarrow N$满足$h(s)=|V|,h(t)=0$,且对任意的边$(u,v)in E_{f}$,有$h(u)leq h(v)+1$,那么$h$是一个高度函数

    3 对于任意两个节点$u,vin V$,如果$h(u)>h(v)+1$,那么$(u,v) otin E_{f}$

    4 推送重贴标签算法的思想是在算法的任何时候,维护一个预流$f$和高度函数$h$,并且使用推送操作重贴标签操作来进行更新。

    5 推送操作:如果$u$是一个溢出节点,$c_{f}(u,v)>0$,且$h(u)=h(v)+1$,那么推送操作$PUSH(u,v)$作用于节点$u,v$。设节点$u$的超额流存放在$u.e$,高度存放在$u.h$。下面是推送操作的伪代码:

     

    每次从节点$u$推送到节点$v$的流量为$Delta _{f}(u,v)=min(u.e,c_{f}(u,v))$,保证不会使得$u.e$变为负数,同时超过$c(u,v)$.

    如果在一次$PUSH$ 操作后,$(u,v)$达到饱和状态,即$c_{f}(u,v)=0$,那么称此次推送操作为饱和推送,否则为非饱和推送

    6 从节点$u$到节点$v$的一个非饱和推送之后,节点$u$将不再溢出。

    7 重贴标签操作:如果节点$u$溢出,且对于所有的边$(u,v)in E_{f}$,有$u.hleq v.h$,那么此时将进行重贴标签操作$RELABEL(u)$。

    这个操作被调用时,$E_{f}$中至少包含一条从$u$出发的边。因为$e(u)=sum_{vin V}f(v,u)-sum_{vin V}f(u,v)>0$,所以至少有一个$v$使得$(v,u).f>0$,所以至少有一条边$(u,v)in E_{f}$。

    8 算法的整体流程:

    (1)初始化

    (2)主循环

    9 设$f$为流网络G的一个预流,$h$为高度函数。如果一个节点$u$溢出,那么要么可以对$u$进行推送操作,要么可以对$u$进行重贴标签操作。

    10 在GENERIC-PUSH-RELABEL的整个过程中,每个节点的高度不会减少,且每次重贴标签操作会使得$u$的高度至少增加1.

    11 在GENERIC-PUSH-RELABEL的整个过程中,将始终维持$h$是一个高度函数

    12 在GENERIC-PUSH-RELABEL的整个过程中,不存在从源点到汇点的路径。

    13 如果GENERIC-PUSH-RELABEL算法能够终止,那么计算出的$f$是一个最大流。

    以下为证明

    9的证明

    对于任意残存边$(u,v)$有$h(u)leq h(v)+1$。如果不能对$u$进行推送操作,那么对任意的$(u,v)in E_{f}$有$h(u)<h(v)+1$,即$h(u)leq h(v)$,因此可以对$u$进行重贴标签操作。

    11的证明

    (1)初始时,$h$ 是一个高度函数;

    (2)重贴标签操作作用于$u$后,对于所有的$(u,v)$仍然满足$h(u)leq h(v)+1$。对于进入$u$的边,比如$(w,u)$,在重贴标签之前有$w.hleq u.h+1$,之后有$w.h< u.h+1$。因此重贴标签操作将保持$h$仍然为高度函数。

    (3)$PUSH(u,v)$操作之后可能增加一条边$(v,u)$,$v.h=u.h-1<u.h+1$,因此$h$仍然是高度函数。还有可能删掉边$(u,v)$,这没有任何影响。

    12的证明

    假设存在$p=<v_{0},v_{1},...,v_{k}>$,其中$s=v_{0},t=v_{k}.$由于$p$经过每个节点最多一次,那么有$k<|V|$。由于$h(t)=0$,而对于任意一条边$(v_{i},v_{i+1})$,$v_{i}$的高度最多比$v_{i+1}$的高度达1,所以$h(s)leq k<|V|$,这与$h(s)=|V|$矛盾

    13的证明

    (1)首先,在算法的整个过程中,$f$都是一个预流。初始时是,算法每个循环中,重贴标签不影响$f$,推送操作结束后$f$也仍然是一个预流;

    (2)如果算法能够终止,那么终止时,没有节点需要推送操作和重贴标签操作,由9可知,没有溢出节点存在,所以$f$是一个流。由12可知,没有增广路径存在,所以由最大流最小割定理,$f$是最大流

    下一篇

  • 相关阅读:
    unicode下各种类型转换CString、string
    单元测试简介
    linux系统目录详解
    Python 几个重要的内置函数
    python join split
    将博客搬至CSDN
    COCOS2DX3.0的3种触摸响应机制
    [转] 千万别在最能吃苦的年纪选择安逸
    明白什么是“五险一金”
    MAC 安装更新 ANT
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/6012792.html
Copyright © 2020-2023  润新知