Example #1
0
        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));
                }
            }
        }