首页 > 代码库 > 最大流学习笔记(5)-前置重贴标签算法一
最大流学习笔记(5)-前置重贴标签算法一
上一篇
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$出发的边。
最大流学习笔记(5)-前置重贴标签算法一