be equal to 0 at termination since there cannot be any remaining active nodes at the end of the algorithm's execution. This means that over the execution of the algorithm, the nonsaturating pushes must make up the difference of the relabel and saturating push operations in order for to terminate with a value of 0. The relabel operation can increase by at most . A saturating push on activates if it was inactive before the push, increasing by at most . Hence, the total contribution of all saturating pushes operations to is at most . A nonsaturating push on always deactivates , but it can also activate as in a saturating push. As a result, it decreases by at least . Since relabels and saturating pushes increase , the total number of nonsaturating pushes must make up the difference of . This results in a time bound of for the nonsaturating push operations. In sum, the algorithm executes relabels, saturating pushes and nonsaturating pushes. Data structures can be designed to pick and execute an applicable operation in time. Therefore, the time complexity of the algorithm is . Example The following is a sample execution of the generic push-relabel algorithm, as defined above, on the following simple network flow graph diagram. In the example, the and values denote the label and excess , respectively, of the node during the execution of the algorithm. Each residual graph in the example only contains the residual arcs with a capacity larger than zero. Each residual graph may contain multiple iterations of the loop. The example (but with initial flow of 0) can be run here interactively. Practical implementations While the generic push–relabel algorithm has time complexity, efficient implementations achieve or lower time complexity by enforcing appropriate rules in selecting applicable push and relabel operations. The empirical performance can be further improved by heuristics. "Current-arc" data structure and discharge operation The "current-arc" data structure is a mechanism for visiting the in- and out-neighbors of a node in the flow network in a static circular order. If a singly linked list of neighbors is created for a node, the data structure can be as simple as a pointer into the list that steps through the list and rewinds to the head when it runs off the end. Based on the "current-arc" data structure, the discharge operation can be defined. A discharge operation applies on an active