Looking at this paper, the algorithm is done in two phases.
First phase:
Do a DFS search,
compute the spanning tree with p[v] representing parent of v,
compute the lowest ancestor (closest to the root) accessible from the descendants with low[v]. This phase is straight-forward, and well discussed.
Second phase:
For source s and sink t, start with L = [ s-, t ]
For each edge in the spanning tree
If sign(low[v]) == plus,
insert v after p[v]
/* Orient in direction of spanning tree numbering */
sign(p[v]) = minus
If sign(low[v]) == minus
insert v before p[v]
/* Orient in opposite direction to spanning tree numbering */
sign(p[v]) = plus
- Finally output (or number) nodes based on order in the list.
The second phase of the algorithm is very simple to execute, and the paper has an example. It also has a proof by induction.
But the intuition about why this works is not mentioned anywhere in the paper, or on the net.
Would anybody reading this, have an idea on the same.