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()); }
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_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_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 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)); }
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_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] } }); }