1 預流:預流是一個$V\times V \rightarrow R$的函數$f$,該函數對於每個節點$u\in V-\{s\}$滿足容量限制條件和下面的性質:
$\sum_{v\in V}f(v,u)-\sum_{v\in V}f(u,v)\geq 0$
定義$e(u)=\sum_{v\in V}f(v,u)-\sum_{v\in V}f(u,v)$為進入節點$u$的超額流。如果$e(u)>0$,稱$u$溢出
2 高度函數的定義:設G是一個流網絡,如果函數$f:V\rightarrow N$滿足$h(s)=|V|,h(t)=0$,且對任意的邊$(u,v)\in E_{f}$,有$h(u)\leq h(v)+1$,那么$h$是一個高度函數
3 對於任意兩個節點$u,v\in V$,如果$h(u)>h(v)+1$,那么$(u,v)\notin 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.h\leq v.h$,那么此時將進行重貼標簽操作$RELABEL(u)$。

這個操作被調用時,$E_{f}$中至少包含一條從$u$出發的邊。因為$e(u)=\sum_{v\in V}f(v,u)-\sum_{v\in 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.h\leq 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$是最大流
