public void DfsTopologicalSort_WhenAcyclicGraph_ThenTopologicalOrder()
        {
            // given
            DirectedSimpleGraph <int, object, object> graph = new DirectedSimpleGraph <int, object, object>(
                Enumerable.Range(0, 6).ToArray());

            graph.AddEdgeBetween(graph[0], graph[2]);
            graph.AddEdgeBetween(graph[0], graph[4]);
            graph.AddEdgeBetween(graph[1], graph[0]);
            graph.AddEdgeBetween(graph[1], graph[4]);
            graph.AddEdgeBetween(graph[3], graph[1]);
            graph.AddEdgeBetween(graph[3], graph[0]);
            graph.AddEdgeBetween(graph[3], graph[2]);
            graph.AddEdgeBetween(graph[5], graph[1]);
            graph.AddEdgeBetween(graph[5], graph[2]);
            graph.AddEdgeBetween(graph[5], graph[4]);

            var expecteds = new Vertex <int>[][] {
                new Vertex <int>[] { graph[3], graph[5], graph[1], graph[0], graph[2], graph[4] },
                new Vertex <int>[] { graph[5], graph[3], graph[1], graph[0], graph[2], graph[4] },
                new Vertex <int>[] { graph[3], graph[5], graph[1], graph[0], graph[4], graph[2] },
                new Vertex <int>[] { graph[5], graph[3], graph[1], graph[0], graph[4], graph[2] }
            };
            // when
            IEnumerable <Vertex <int> > result = TopologicalSorting.DfsTopologicalSort(graph);

            // then
            expecteds.Should().ContainEquivalentOf(result.ToArray());
        }
Пример #2
0
        public void SetUp()
        {
            directedGraph = new DirectedSimpleGraph <int, object, object>(Enumerable.Range(0, 10));
            directedGraph.AddEdgeBetween(directedGraph[0], directedGraph[1]);
            directedGraph.AddEdgeBetween(directedGraph[1], directedGraph[3]);
            directedGraph.AddEdgeBetween(directedGraph[1], directedGraph[7]);
            directedGraph.AddEdgeBetween(directedGraph[3], directedGraph[4]);
            directedGraph.AddEdgeBetween(directedGraph[4], directedGraph[0]);
            directedGraph.AddEdgeBetween(directedGraph[5], directedGraph[4]);
            directedGraph.AddEdgeBetween(directedGraph[5], directedGraph[8]);
            directedGraph.AddEdgeBetween(directedGraph[6], directedGraph[2]);
            directedGraph.AddEdgeBetween(directedGraph[6], directedGraph[9]);
            directedGraph.AddEdgeBetween(directedGraph[8], directedGraph[5]);

            undirectedGraph = new UndirectedSimpleGraph <int, object, object>(Enumerable.Range(0, 10));
            undirectedGraph.AddEdgeBetween(undirectedGraph[0], undirectedGraph[1]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[0], undirectedGraph[4]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[1], undirectedGraph[3]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[1], undirectedGraph[7]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[2], undirectedGraph[6]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[3], undirectedGraph[4]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[4], undirectedGraph[5]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[5], undirectedGraph[8]);
            undirectedGraph.AddEdgeBetween(undirectedGraph[6], undirectedGraph[9]);
        }
        public void InputsTopologicalSort_WhenEmptyGraph_ThenVertices()
        {
            // given
            IDirectedGraph <int, object, object> graph =
                new DirectedSimpleGraph <int, object, object>(Enumerable.Range(0, 5));
            // when
            IEnumerable <Vertex <int> > result = graph.InputsTopologicalSort();

            // then
            result.Should().Equal(graph.Vertices);
        }
        public void FindScc_WhenSingleComponent_ThenAllVertices()
        {
            // given
            var graph = new DirectedSimpleGraph <int, object, object>(Enumerable.Range(0, 7));

            graph.AddEdgeBetween(graph[0], graph[1]);
            graph.AddEdgeBetween(graph[1], graph[2]);
            graph.AddEdgeBetween(graph[2], graph[3]);
            graph.AddEdgeBetween(graph[3], graph[4]);
            graph.AddEdgeBetween(graph[4], graph[5]);
            graph.AddEdgeBetween(graph[5], graph[6]);
            graph.AddEdgeBetween(graph[6], graph[0]);
            // when
            List <HashSet <Vertex <int> > > result = graph.FindScc();

            // then
            result.Should().BeEquivalentTo(new[] { new HashSet <Vertex <int> >(graph.Vertices) });
        }
        public void InputsTopologicalSort_WhenAcyclicGraph_ThenTopologicalOrder()
        {
            // given
            DirectedSimpleGraph <int, object, object> graph = new DirectedSimpleGraph <int, object, object>(
                Enumerable.Range(0, 6).ToArray());

            graph.AddEdgeBetween(graph[0], graph[2]);
            graph.AddEdgeBetween(graph[0], graph[4]);
            graph.AddEdgeBetween(graph[1], graph[0]);
            graph.AddEdgeBetween(graph[1], graph[4]);
            graph.AddEdgeBetween(graph[3], graph[1]);
            graph.AddEdgeBetween(graph[3], graph[0]);
            graph.AddEdgeBetween(graph[3], graph[2]);
            graph.AddEdgeBetween(graph[5], graph[1]);
            graph.AddEdgeBetween(graph[5], graph[2]);
            graph.AddEdgeBetween(graph[5], graph[4]);
            // when
            IEnumerable <Vertex <int> > result = TopologicalSorting.InputsTopologicalSort(graph);

            // then
            result.Should().ContainInOrder(graph[3], graph[5], graph[1], graph[0], graph[2], graph[4]);
        }
        public void FindScc_WhenManyComponents_ThenAllListed()
        {
            // given
            var graph = new DirectedSimpleGraph <int, object, object>(Enumerable.Range(0, 10));

            graph.AddEdgeBetween(graph[0], graph[4]);
            graph.AddEdgeBetween(graph[0], graph[5]);
            graph.AddEdgeBetween(graph[1], graph[0]);
            graph.AddEdgeBetween(graph[2], graph[3]);
            graph.AddEdgeBetween(graph[3], graph[1]);
            graph.AddEdgeBetween(graph[4], graph[1]);
            graph.AddEdgeBetween(graph[4], graph[3]);
            graph.AddEdgeBetween(graph[6], graph[5]);
            graph.AddEdgeBetween(graph[6], graph[9]);
            graph.AddEdgeBetween(graph[7], graph[4]);
            graph.AddEdgeBetween(graph[7], graph[6]);
            graph.AddEdgeBetween(graph[8], graph[3]);
            graph.AddEdgeBetween(graph[8], graph[7]);
            graph.AddEdgeBetween(graph[9], graph[8]);
            // when
            List <HashSet <Vertex <int> > > result = graph.FindScc();

            // then
            result.Should().BeEquivalentTo(
                new[] {
                new HashSet <Vertex <int> > {
                    graph[0], graph[1], graph[3], graph[4]
                },
                new HashSet <Vertex <int> > {
                    graph[2]
                },
                new HashSet <Vertex <int> > {
                    graph[5]
                },
                new HashSet <Vertex <int> > {
                    graph[6], graph[7], graph[8], graph[9]
                }
            });
        }
        public void InputsTopologicalSort_WhenCyclicGraph_ThenDirectedCyclicGraphException()
        {
            // given
            DirectedSimpleGraph <int, object, object> graph = new DirectedSimpleGraph <int, object, object>(
                Enumerable.Range(0, 6).ToArray());

            graph.AddEdgeBetween(graph[0], graph[2]);
            graph.AddEdgeBetween(graph[0], graph[4]);
            graph.AddEdgeBetween(graph[1], graph[0]);
            graph.AddEdgeBetween(graph[1], graph[4]);
            graph.AddEdgeBetween(graph[2], graph[1]);
            graph.AddEdgeBetween(graph[3], graph[1]);
            graph.AddEdgeBetween(graph[3], graph[0]);
            graph.AddEdgeBetween(graph[3], graph[2]);
            graph.AddEdgeBetween(graph[5], graph[1]);
            graph.AddEdgeBetween(graph[5], graph[2]);
            graph.AddEdgeBetween(graph[5], graph[4]);
            // when
            Action action = () => TopologicalSorting.InputsTopologicalSort(graph);

            // then
            action.Should().Throw <DirectedCyclicGraphException>();
        }
        public void FindScc_WhenEmptyGraph_ThenEachVertexIsComponent()
        {
            // given
            var graph = new DirectedSimpleGraph <int, object, object>(Enumerable.Range(0, 4));
            // when
            List <HashSet <Vertex <int> > > result = graph.FindScc();

            // then
            result.Should().BeEquivalentTo(
                new[] {
                new HashSet <Vertex <int> > {
                    graph[0]
                },
                new HashSet <Vertex <int> > {
                    graph[1]
                },
                new HashSet <Vertex <int> > {
                    graph[2]
                },
                new HashSet <Vertex <int> > {
                    graph[3]
                }
            });
        }
        public void SetUp()
        {
            directedGraph = new DirectedSimpleGraph <int, object, Weighted>(
                Enumerable.Range(0, 10).ToList());
            directedGraph.AddEdgeBetween(directedGraph[0], directedGraph[1],
                                         new Weighted(4.0));
            directedGraph.AddEdgeBetween(directedGraph[1], directedGraph[4],
                                         new Weighted(7.0));
            directedGraph.AddEdgeBetween(directedGraph[1], directedGraph[7],
                                         new Weighted(12.0));
            directedGraph.AddEdgeBetween(directedGraph[2], directedGraph[4],
                                         new Weighted(6.0));
            directedGraph.AddEdgeBetween(directedGraph[2], directedGraph[6],
                                         new Weighted(8.0));
            directedGraph.AddEdgeBetween(directedGraph[3], directedGraph[0],
                                         new Weighted(3.0));
            directedGraph.AddEdgeBetween(directedGraph[3], directedGraph[7],
                                         new Weighted(5.0));
            directedGraph.AddEdgeBetween(directedGraph[4], directedGraph[5],
                                         new Weighted(1.0));
            directedGraph.AddEdgeBetween(directedGraph[4], directedGraph[3],
                                         new Weighted(10.0));
            directedGraph.AddEdgeBetween(directedGraph[5], directedGraph[6],
                                         new Weighted(4.0));
            directedGraph.AddEdgeBetween(directedGraph[5], directedGraph[8],
                                         new Weighted(2.0));
            directedGraph.AddEdgeBetween(directedGraph[6], directedGraph[5],
                                         new Weighted(7.0));
            directedGraph.AddEdgeBetween(directedGraph[7], directedGraph[5],
                                         new Weighted(2.0));
            directedGraph.AddEdgeBetween(directedGraph[7], directedGraph[8],
                                         new Weighted(6.0));
            directedGraph.AddEdgeBetween(directedGraph[8], directedGraph[9],
                                         new Weighted(10.0));
            directedGraph.AddEdgeBetween(directedGraph[9], directedGraph[6],
                                         new Weighted(3.0));

            undirectedGraph = new UndirectedSimpleGraph <int, object, Weighted>(
                Enumerable.Range(0, 10).ToList());
            undirectedGraph.AddEdgeBetween(undirectedGraph[0], undirectedGraph[1],
                                           new Weighted(4.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[1], undirectedGraph[4],
                                           new Weighted(7.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[1], undirectedGraph[7],
                                           new Weighted(12.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[2], undirectedGraph[6],
                                           new Weighted(8.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[3], undirectedGraph[0],
                                           new Weighted(3.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[3], undirectedGraph[7],
                                           new Weighted(5.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[4], undirectedGraph[5],
                                           new Weighted(1.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[4], undirectedGraph[3],
                                           new Weighted(10.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[5], undirectedGraph[8],
                                           new Weighted(2.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[7], undirectedGraph[5],
                                           new Weighted(2.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[7], undirectedGraph[8],
                                           new Weighted(6.0));
            undirectedGraph.AddEdgeBetween(undirectedGraph[9], undirectedGraph[6],
                                           new Weighted(3.0));
        }