public void ComputeStronglyConnectedComponents_SimpleGraph_SecondRunReturnsNoComponents()
        {
            var g = CreateGraph(5, false, (0, 1), (1, 2), (2, 3), (3, 4), (0, 4));
            var a = new TarjanStronglyConnectedComponentsAlgorithm <DirectedGraph <Empty, Empty>, VertexIdx, EdgeIdx>(g);

            a.ComputeStronglyConnectedComponents(new VertexIdx(0));
            var components = a.ComputeStronglyConnectedComponents(new VertexIdx(0));

            Assert.That(components.Length, Is.Zero);
        }
        public void ComputeStronglyConnectedComponents_WikipediaExample_IsCorrect()
        {
            var g = CreateGraph(8, false, (0, 4), (1, 0), (2, 1), (2, 3), (3, 2), (4, 1), (5, 1), (5, 4), (5, 6),
                                (6, 2), (6, 5), (7, 3), (7, 6), (7, 7));
            var a          = new TarjanStronglyConnectedComponentsAlgorithm <DirectedGraph <Empty, Empty>, VertexIdx, EdgeIdx>(g);
            var components = a.ComputeStronglyConnectedComponents(new VertexIdx(7));

            Assert.That(components.Length, Is.EqualTo(4));
            Assert.That(components[0].ToArray(), Is.EquivalentTo(Vertices(0, 1, 4)));
            Assert.That(components[1].ToArray(), Is.EquivalentTo(Vertices(2, 3)));
            Assert.That(components[2].ToArray(), Is.EquivalentTo(Vertices(5, 6)));
            Assert.That(components[3].ToArray(), Is.EquivalentTo(Vertices(7)));
        }
        public void ComputeStronglyConnectedComponents_SimpleGraph_IsCorrect()
        {
            var g          = CreateGraph(5, false, (0, 1), (1, 2), (2, 3), (3, 4), (0, 4));
            var a          = new TarjanStronglyConnectedComponentsAlgorithm <DirectedGraph <Empty, Empty>, VertexIdx, EdgeIdx>(g);
            var components = a.ComputeStronglyConnectedComponents(new VertexIdx(0));

            Assert.That(components.Length, Is.EqualTo(5));
            Assert.That(components[0].ToArray(), Is.EqualTo(new[] { new VertexIdx(4) }));
            Assert.That(components[1].ToArray(), Is.EqualTo(new[] { new VertexIdx(3) }));
            Assert.That(components[2].ToArray(), Is.EqualTo(new[] { new VertexIdx(2) }));
            Assert.That(components[3].ToArray(), Is.EqualTo(new[] { new VertexIdx(1) }));
            Assert.That(components[4].ToArray(), Is.EqualTo(new[] { new VertexIdx(0) }));
        }
        public void ComputeStronglyConnectedComponents_SimpleGraph_CanRunPartially()
        {
            var g          = CreateGraph(5, false, (0, 1), (1, 2), (2, 3), (3, 4), (0, 4));
            var a          = new TarjanStronglyConnectedComponentsAlgorithm <DirectedGraph <Empty, Empty>, VertexIdx, EdgeIdx>(g);
            var components = a.ComputeStronglyConnectedComponents(new VertexIdx(2));

            Assert.That(components.Length, Is.EqualTo(3));
            Assert.That(components[0].ToArray(), Is.EqualTo(Vertices(4)));
            Assert.That(components[1].ToArray(), Is.EqualTo(Vertices(3)));
            Assert.That(components[2].ToArray(), Is.EqualTo(Vertices(2)));

            components = a.ComputeStronglyConnectedComponents(new VertexIdx(0));

            Assert.That(components.Length, Is.EqualTo(2));
            Assert.That(components[0].ToArray(), Is.EqualTo(Vertices(1)));
            Assert.That(components[1].ToArray(), Is.EqualTo(Vertices(0)));
        }
        public void ComputeStronglyConnectedComponents_DeepGraph_IsCorrect(int size)
        {
            var g  = new DirectedGraph <Empty, Empty>();
            var v0 = g.AddVertex(Empty.Default);
            var v1 = v0;

            for (var i = 0; i < size; i++)
            {
                var v2 = g.AddVertex(Empty.Default);
                g.AddEdge(v1, v2, Empty.Default);
                v1 = v2;
            }

            var a          = new TarjanStronglyConnectedComponentsAlgorithm <DirectedGraph <Empty, Empty>, VertexIdx, EdgeIdx>(g);
            var components = a.ComputeStronglyConnectedComponents(v0);

            Assert.That(components.Length, Is.EqualTo(size + 1));
        }