private void TarjanOfflineLeastCommonAncestorAlgorithm <TVertex, TEdge>( IVertexListGraph <TVertex, TEdge> g, TVertex root, SEquatableEdge <TVertex>[] pairs ) where TEdge : IEdge <TVertex> { var lca = g.OfflineLeastCommonAncestorTarjan(root, pairs); var predecessors = new VertexPredecessorRecorderObserver <TVertex, TEdge>(); var dfs = new DepthFirstSearchAlgorithm <TVertex, TEdge>(g); using (predecessors.Attach(dfs)) dfs.Compute(root); TVertex ancestor; foreach (var pair in pairs) { if (lca(pair, out ancestor)) { Assert.True(EdgeExtensions.IsPredecessor(predecessors.VertexPredecessors, root, pair.Source)); Assert.True(EdgeExtensions.IsPredecessor(predecessors.VertexPredecessors, root, pair.Target)); } } }