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$是最大流