最大流學習筆記(5)-前置重貼標籤演算法一

weixin_34054866發表於2019-01-11

上一篇

 

1、許可邊:設$f$是流網路G的一個預流,$h$是高度函式。對於邊$(u,v)$,如果$c_{f}(u,v)>0$且$h(u)=h(v)+1$,那麼邊$(u,v)$是一個許可邊。否則是非許可邊。許可網路$G_{f,h}=(V,E_{f,h})$,$E_{f,h}$是許可邊的集合

 

2、許可網路是有向無環的。因為對於每條許可邊$(u,v)$來說,$h(u)=h(v)+1$,所以如果存在環,設環的大小是$k$,那麼最後會有$h(u)=h(u)+k$。這是不滿足的。

 

3、 如果$u$是溢位節點,且$(u,v)$是許可邊,則$PUSH(u,v)$可作用於節點$u$上,該操作不產生新的許可邊,但有可能導致邊$(u,v)$成為非許可邊。

 

4、如果$u$是一個溢位節點,且不存在從$u$出發的許可邊,則$RELABEL(u)$可作用於$u$,操作之後將至少存在一條從$u$出發的許可邊,但是不存在進入$u$的許可邊。

 

5、在該演算法中,將所有$u$的鄰接邊(包括離開$u$的和進入$u$的)都組織成一個連結串列$u.N$,其中$u.N.head$指向連結串列第一個節點,$v.next-heighbor$指向下一個,最後一個節點的下一個為$NIL$,$u.current$指向當前的節點。

 

6、釋放溢位節點:這個操作是將溢位節點$u$的流推送的相鄰節點。下面是該函式的實現:

 

7、$DISCHARGE$函式進行第7行的$PUSH$操作時該操作適用於節點$u$,執行第4行的$RELABEL$函式時該操作適用於$u$.

 

以下是證明

3的證明

$PUSH(u,v)$能夠產生的唯一的殘存邊是$(v,u)$,但是$h(u)=h(v)+1$,所以$(v,u)$不可能成為殘存邊。同時如果該推送是一個飽和推送,則操作後$c_{f}(u,v)=0$,這使得$(u,v)$成為非許可邊

 

4的證明

因為對$u$重貼標籤是將$u.h$的高度變為從其出發的所有殘存邊高度最小的加1,所以至少有一條邊是到達這個高度最小的節點。

假設重貼標籤之後存在進入$u$ 的邊,比如$(w,u)$,那麼有$h(w)=h(u)+1$,而操作之前必有$h(w)>h(u)+1$,根據這裡的3,$(w,u)$不屬於殘存邊。

 

7的證明

(1)第一行和第六行的判斷使得$PUSH$操作是合理的。

(2)對於$RELABEL$函式,有兩種情況:

  i 某次$DISCHARGE$被呼叫時,$u.current$指向連結串列的開頭,這時當執行第四行時所有的邊都是非許可邊。所以可以執行重貼標籤操作

  ii 某次$DISCHARGE$被呼叫時,$u.current$指向連結串列的中間,也就是說執行到中間然後這個函式結束了。現在又回來接著執行。那麼我們只需要證明其他節點執行$PUSH$和$RELABEL$操作不會使得$u$到$u.N$開始到$u.current$這中間的節點的邊變成許可邊就好。首先,其他節點的操作由3可知不可能產生新的許可邊。由4可知其他節點進行重貼標籤操作不會不會產生進入的邊,也就是說沒有從$u$出發的邊。

 

下一篇

相關文章