In The Algorithm Design Manual section 5.9.2, covering graphs and articulation vertices, Steven Skiena writes
Let reachable_ancestor[v] denote the earliest reachable ancestor of vertex v, meaning the oldest ancestor of v that we can reach by a combination of tree edges and back edges.
This phrasing is ambiguous. On the errata page of his website, he clarifies:
it is clearer to say: "denote the earliest reachable ancestor of vertex v, meaning the oldest ancestor of v that we can reach from a descendant of $v$ by using a back edge."
But to me, this phrasing is still somewhat ambiguous. Consider the following four-vertex graph G:
A
|
+ - B
| |
| C
| |
+ - D
We conduct an alphabetical depth-first search (DB is a back edge). According to Skiena's revised definition, it would seem that A is a reachable ancestor of C as follows: D is a descendent of C, and we can reach A from D using a back edge by following the path DBA. However, execution of Skiena's code for finding articulation vertices via depth-first search on G results in reachable_ancestor[C] = B, not A; therefore I don't think he intends for A to count as a reachable ancestor of C.
Might it be more accurate to say that reachable_ancestor is the oldest ancestor of v that we can reach from a descendant of v by using a back edge but without passing through any other ancestors of v?