Maximum flow: The push/relabel method of Goldberg and Tarjan (87)
Distance labels
• Defined with respect to residual capacities
• d(t) = 0, d(s) = n
• d(v) ≤ d(w) + 1 if r(v,w) > 0
Example (distance labels)
3 4
3 3
3 4
2
1
1 3
1 2
3 1
1
3 3
2 2
3 3
2
1
1
1 1
1
A flow The residual network
Example (distance labels)
3 4
3 3
3 4
2
1
1 3
1 2
3 1
1
3 3
2 2
3 3
2
1
1
1 1
1
A flow The residual network
0
1 1
2 2
6
Is this a valid distance labeling ?
Distance labels – basic lemma
Lemma: d(v) is a lower bound on the length of the shortest path from v to the sink
Proof: Let the s.p. to the sink be:
v v1 v2 t
d(v) ≤ d(v1) + 1 ≤ d(v2) + 2 ..... ≤ d(t) + k = k
Preflow (definition)
A preflow is a function on the edges which satisfies the following requirements
• f(v,w) = -f(w,v) skew symmetry
• f(v,w) u(v,w)
• For every w, except s and t, vf(v,w) ≥ 0
Let e(w) = vf(v,w) be the excess at the node v
(we’ll also have e(t) ≥ 0, and e(s) ≤ 0)
Example (preflow)
Nodes with positive excess are called active.
s t
3
3
3
2
2
2
2
1
2
1
0
0
The preflow push algorithm will try to push flow from active nodes towards the sink, relying on d( ).
Initialization (preflow)
3 4
3 3
3 4
2
1 4 3
0 0
0 0
0
3 4
3 3
3 4
2
1 3 4 0
Initialization (distance labels)
3 4
3 3
3 4
2
1 4 3
0 0
0 0
0
3 4
3 3
3 4
2
1
6
0
0
0
0 0 3 4
Recall: s must be disconnected from t when d(s) = n, and the labeling is valid…
0
Admissible arc in the residual graph
w
v
d(v) = d(w) + 1
The push/relabel algorithm
While there is an active node {
pick an active node v and push/relabel(v)
}
Push/relabel(v) {
If there is an admissible arc (v,w) then {
push = min {e(v) , r(v,w)} flow from v to w
} else {
d(v) := min{d(w) + 1 | r(v,w) > 0} (relabel)
}
Correctness
Lemma 1: The source is reachable from every active vertex in the residual network
Proof:
Which means that no flow enters S --
A contradiction
v s
S
Assume that’s not the case:
Correctness (cont)
Corollary: There is an outgoing residual arc incident with every active vertex
Corollary: So we can push-relabel as long as there is an active vertex
Correctness (cont)
Lemma 2: Distance labels only increase and remain valid at all times
Proof:
By induction on the number of push and relabel operations.
For relabel this is clear by the definition of relabel
For push:
v w
d(v) = d(w) + 1 so even if we add (w,v) to the residual network then it is still a valid labeling
Correctness (cont)
Lemma 3: When (and if) the algorithm stops the preflow is a maximum flow
Proof:
It is a flow since there is no active vertex.
It is maximum since the sink is not reachable from the source in the residual network. (d(s) = n, and the labeling is valid)
Complexity analysis
Another example
Complexity analysis
Observation: d(v) increases when we relabel v !
Lemma: d(v) ≤ 2n-1
Proof:
v v1 v2 s
d(v) ≤ d(v1) + 1 ≤ d(v2) + 2 ..... ≤ d(s) + (n-1) = 2n-1
Complexity analysis (cont)
Lemma: The # of relabelings is (2n-1)(n-2) < 2n2
Proof:
At most 2n-1 per each node other than s and t
Complexity analysis (cont)
Def: Call a push saturating if min{e(v), r(v,w)} = r(v,w)
Lemma: The # of saturating pushes is at most 2nm
Proof: Before another saturating push on (v,w), we must push from w to v.
d(w) must increase by at least 2
Since d(w) ≤ 2n-1, this can happen at most n times
Nonsaturating pushes
Lemma: The # of nonsaturating pushes is at most 4n2m
Proof:
Let Φ = Σv active d(v)
• Decreases (by at least one) by every nonsaturating push
• Increases by at most 2n-1 by a saturating push : total increase (2n-1)2nm
• Increases by each relabeling: total increase < (2n-1)(n-2)
Implementation
Maintain a list of active nodes, so finding an active node is easy
Given an active node v, we need to decide if there is an admissible arc (v,w) to push on ?
v
current edge
All edges, not only those in R
Current edge
v
current edge
Push/relabel(v): If the current edge (v,w) is admissible, push on it (updating the list of active vertices)
Otherwise, advance the current edge pointer
if you are on the last edge, relabel v and set the current edge to be the first one.
Is this implementation correct?
Lemma: When we relabel v there is no admissible arc (v,w)
Proof: After we scanned (v,w) either (v,w) dropped off the residual network or d(v) ≤ d(w)
If d(v) ≤ d(w) then this must be the case now since v has not been relabeled.
If (v,w) became residual since it was scanned then when that happened d(w) = d(v) + 1 d(v) ≤ d(w) and this must be the case now
Analysis
Lemma: The total time spent at v between two relabelings of v is Δv plus O(1) per push out of v
Summary: Since we relabel v at most (2n-1) times we get that the total work at v is O(nΔv) + O(1) per push out of v.
Summing over all vertices we get that the total time is O(nm) + #of pushes
O(n2m)
Maintain the list of active vertices as a FIFO queue (Q)
Discharge the first vertex of the queue:
Discharge(v) {
While v is active and hasn’t been relabeled then push/relabel(v).
(If the loop stops because v is relabeled then add v to the end of Q)
}
Reducing the # of nonsaturating pushes
4
1
2
2
2
4
2
Example (FIFO order)
0
4
1
2
2
2
4
2 0
0
6 0
0 4
2
0
4
1
2
2
2
4
2 0
0
6 0
0 4
2
0
4
1
2
2
2 0
0
6 0
0 4
2
relabel
x y
z
u v
w
Q: z y
4
2
0
4
1
2
2
2
4
2 0
1
6 0
0 4
2
0
4
1
2
2
2 0
1
6 0
0 4
2
x y
z
u v
w
Q: y z relabel
4
2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
x y
z
u v
w
Q: z y
push
push
4
2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
2
2
push
x y
z
u v
w
Q: y u
2
2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: u z
relabel
2
2
1
4
1
2
2
2
4
2 0
1
6 2
0 4
2
1
4
1
2
2
2 0
1
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: z u
relabel
2
2
1
4
1
2
2
2
4
2 0
3
6 2
0 4
2
0
4
1
2
2
2 0
3
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: u z
Passes
Pass 1: Until you finish discharging all vertices initially in Q
Pass i: Until you finish discharging all vertices added to Q in pass (i-1)
0
4
1
2
2
2
4
2 0
0
6 0
0 4
2
0
4
1
2
2
2 0
0
6 0
0 4
2
relabel
x y
z
u v
w
Q: z y
4
2
0
4
1
2
2
2
4
2 0
1
6 0
0 4
2
0
4
1
2
2
2 0
1
6 0
0 4
2
x y
z
u v
w
Q: y z relabel
4
2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
x y
z
u v
w
Q: z y
4
2
End of pass 1
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
x y
z
u v
w
Q: z y
push
push
4
2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
2
2
push
x y
z
u v
w
Q: y u
2
2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: u z
2
2 End of pass 2
0
4
1
2
2
2
4
2 0
1
6 2
0 4
2
0
4
1
2
2
2 0
1
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: u z
relabel
2
2
1
4
1
2
2
2
4
2 0
1
6 2
0 4
2
1
4
1
2
2
2 0
1
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: z u
relabel
2
2
1
4
1
2
2
2
4
2 0
3
6 2
0 4
2
0
4
1
2
2
2 0
3
6 2
0 4
2
2
2
2
x y
z
u v
w
Q: u z
End of pass 3
Analysis
Note that we still have the O(n2m) bound
How many passes are there ?
Let Φ = maxactive vd(v) 1) If the algorithm does not relabel during a pass then Φ decreases by at least 1 (each active node at the beginning of a pass moved its excess to a vertex with lower label)
2) If we relabel then Φ may increase by at most the maximum increase of a distance label
There are at most O(n2) passes of the second kind.
These passes increase Φ by at most O(n2)
There are at most O(n2) passes of the first kind
Analysis (Cont)
So we have O(n2) passes
In each pass we have at most one nonsaturating push per vertex
O(n3) nonsaturating pushes
O(n3) total running time
A faster implementation
Maintain a (dynamic) forest of some of the admissible current edges
Reminder: Admissible arc in the residual graph
w
v
d(v) = d(w) + 1
A faster implementation
Maintain a (dynamic) forest of some of the admissible current edges
A faster implementation
Maintain a (dynamic) forest of some of the admissible current edges
Active guys are among the roots
At a high level the algorithm is almost the same
While there is an active node in Q {
Let v be the first in Q
discharge(v)
}
discharge(v) {
While v is active and hasn’t been relabeled then Treepush/relabel(v).
(If the loop stops because v is relabeled then add v to the end of Q)
}
A faster implementation
Q: v….. discharge(v) Treepush/relabel(v)
v
w
Case 1: (v,w) is admissible
v
w
link(v,w,rf(v,w)),
(v,c) = findmin(v), c = min(c,e(v)), addcost(v,-c)
Let (u,c) = findmin(v) If c=0 cut(u) and repeat If e(v) > 0 and v is not a root then repeat
Case 2: (v,w) is not admissible
v
w
a) If (v,w) is not the last edge then advance the current edge
b) If (v,w) is the last edge we relabel v and perform cut(u) for every child u of v
Treepush/relabel Analysis
O(1) work per link/cut or we advance the current arc
How many cuts do we do ?
O(mn) (each charged to a saturating push or a relabel)
O(nm) links
How many timesTreepush/relabel advance the current arc?
O(mn)
Analysis (Cont)
Summary: The running time is determined by O(mn) dynamic tree operations
O(mnlog n)
Can we improve on that ?
Notice that we have not really used the fact that Q is a queue, any list would do !
Idea: Don’t let the trees to grow too large
Case 1: (v,w) is admissible
v
w
link(v,w,rf(v,w)),
(v,c) = findmin(v), c = min(c,e(v)), addcost(v,-c)
Let (u,c) = findmin(v) If c=0 cut(u) and repeat If e(v) > 0 and v is not a root then repeat
We won’t do the link if we are about to create a too large tree (say larger than k)
If we are about to create a tree with at least k vertices
v
w
Push from v to w min{e(v),rf(v,w)} flow
(w,c) = findmin(w), c = min(c,e(w)), addcost(w,-c)
Let (u,c) = findmin(w) If c=0 cut(u) and repeat If e(w) > 0 and w is not a root then repeat
What collapses in our analysis ?
There are calls to Treepush/relabel that do we cannot charge to links (or cuts) and do not advance current arc!
v
r
w
How do we recover ?
v
r
w
May assume that the push from v is not saturating..(there are only O(nm) saturating ones)
v is not active after such Treepush/relabel
We are going to bound the # of such Treepush/relabels by bounding the # of times a node becomes active
Activating nodes
When does a node become active ?
v
r
w
• In Treepush/relabel. We know that there are O(mn) of them except for nonsaturating ones, that do not link/cut.
So we can further focus on those problematic Treepush/relabels that make r active
Concluding
v
r
w
May assume that v becomes inactive and r becomes active and the push is not saturating and does not link
Tv
Tr
Either Tv or Tr is large: ≥ k/2
We charge the large tree.
v
r
w
Since the root of the tree that we charge either becomes active or inactive each tree is charged at most twice in a phase
Tv
Tr
If the tree did not exist at the beginning of the phase then further deliver the charge it to the link or cut that created it
Each link is charged once, a cut is charged twice O(mn) such charges over all phases.
At the beginning of a phase we have O(n/k) large trees, each charged once O(n3/k)
So we get that nodes get activated at most O(mn + n3/k) times
For k=n2/m we get the bound of O(mnlog(n2/m))
This also bounds the # of Treepush/relabels and the # of dynamic tree operations