最大流学习笔记(6)-前置重贴标签算法二

上一篇

8、前置重贴标签操作算法流程:将维护一个链表$L$,该表由$V-{s,t}$中的所有节点构成,$L$中的节点的顺序将按照许可网络中的拓扑排序存放。$u.next$是链表$L$的下一个节点。下面是算法的伪代码:

9、 为了证明RELABEL-TO-FRONT确定计算出了一个最大流,下面将证明该算法就是GENERIC-PUSH-RELABEL的一种实现。首先,7证明了推送操作和重贴标签操作在适用的情况下才会被调用,下面将证明算法结束时,没有任何基本操作可以执行。证明的流程是说明在算法的整个流程中,$L$中的节点始终是$V-{s,t}$的一个拓扑排序,并且在$L$的当前节点$u$之前的节点没有超额流量。

(1)初始时,所有$L$中的节点的高度都是0,没有许可边,因此任意的$V-{s,t}$的排列都是一个拓扑序。且初始时$u$是$L$的开头,所以前面没有任何节点。

(2)在while的每个循环中:

   i 将一直维持拓扑序。许可网络只有在推送和重贴标签时会改变。由3可知,推送操作不产生新的许可边。由4可知,重贴标签操作不产生进入$u$的许可边,只会产生离开$u$的许可边,因此将$u$移动到链表的开头将会保证$L$是一个拓扑网络。

   ii 当前节点$u$前面的所有所有节点都没有超额流量。设下一次作为$u$的节点为$u^{'}$。那么如果$DISCHARGE(u)$操作将$u$重贴标签时,$u^{'}$前只有$u$,而$u$在被释放之后是不会溢出的,因此$u^{'}$前没有溢出节点;假设在$DISCHARGE(u)$中,$u$没有被重贴标签,那么我们只需要证明$DISCHARGE(u)$中执行的所有$PUSH(u,v)$操作的$v$在$L$中的位置都是在$u^{'}$之后,因为$L$始终维持拓扑序。

(3)算法终止的时候,$u$到达了$L$的末尾。所以,每个节点的超额流量为0.所以,没有基本操作可执行。

10、前置重贴标签算法的运行时间为$O(V^{3})$

(1)首先,RELABEL-TO-FRONT算法的while循环执行的次数为$O(V^{3})$,因为由这里的16可知,重贴标签操作是$O(V^{2})$。现在考虑每两次重贴标签操作之间的区段。这样的区段有$O(V^{2})$个。每个区段最多有$O(V)$次$DISCHARGE$次调用。因为如果$DISCHARGE$不执行重贴标签操作,则下一次$DISCHARGE$调用将是链表$L$的下一个节点,而$L$的长度是$O(V)$;如果$DISCHARGE$执行了重贴标签操作,那么以后的操作属于下一个区段。所以总的$DISCHARGE$操作执行的总次数为$O(V^{3})

(2)下面来分析所有的$DISCHARGE$操作中,每种操作的总的执行次数:

 i 第4-5行重贴标签操作:所有的重贴标签操作为$O(V^{2})$

 ii 第7行推送操作:由17饱和推送操作总次数为$O(VE)$,而每次执行非饱和推送,$DISCHARGE$将返回。所以非饱和推送最多执行$O(V^{3})$次;

 iii 第8行指针前进操作:RELABEL-TO-FRONT中每次对$u$进行重贴标签后,更新操作将发生$O(degree(u))$次,所以对于所有节点,总次数为$O(V*degree(u))$次,所以指针前进操作为O(VE)次

原文地址:https://www.cnblogs.com/jianglangcaijin/p/6022890.html