diff --git a/include/CXXGraph/Graph/Graph_decl.h b/include/CXXGraph/Graph/Graph_decl.h index 8488a3d9..d56790f4 100644 --- a/include/CXXGraph/Graph/Graph_decl.h +++ b/include/CXXGraph/Graph/Graph_decl.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include diff --git a/test/CycleCheckTest.cpp b/test/CycleCheckTest.cpp index d200007a..28abaa79 100644 --- a/test/CycleCheckTest.cpp +++ b/test/CycleCheckTest.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include #include "CXXGraph/CXXGraph.hpp" #include "gtest/gtest.h" @@ -9,6 +12,7 @@ using unique = std::unique_ptr; template using shared = std::shared_ptr; +using std::shared_ptr; using std::make_shared; using std::make_unique; @@ -151,3 +155,45 @@ TEST(CycleCheckTest, test_8) { bool res = graph.isCyclicDirectedGraphBFS(); ASSERT_EQ(res, true); } + +TEST(CycleCheckTest, test_2001000) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution distrib(1, 100); + + std::vector> nodes; + std::vector> edges; + nodes.reserve(2001000); + edges.reserve(2001000); + CXXGraph::T_EdgeSet edgeSet; + int node_i = 1; + int edge_i = 1; + + /* + * Creates a Tree Graph with a root node in which each level + * has one more node than the previous one, having in the end + * 2000*2001/2 = 2001000 nodes the form looks as follows: + * node1---node3---node6... + * |-node2 |-node5 + * |-node4 + */ + CXXGraph::Node node(std::to_string(node_i), node_i); + nodes.push_back(std::move(node)); + node_i++; + for (int i = 2; i < 2001; i++) { + for (int j = 0; j < i; j++) { + auto last_i_node = nodes.back(); + CXXGraph::Node node(std::to_string(node_i), node_i); + nodes.push_back(std::move(node)); + node_i++; + CXXGraph::DirectedWeightedEdge edge(std::to_string(edge_i++), last_i_node, nodes.back(), distrib(gen)); + edgeSet.insert(make_shared>(std::move(edge))); + } + } + CXXGraph::Graph graph_tree(edgeSet); + ASSERT_EQ(graph_tree.isCyclicDirectedGraphBFS(), false); + CXXGraph::DirectedWeightedEdge edge(std::to_string(edge_i++), nodes.back(), nodes.front(), distrib(gen)); + edgeSet.insert(make_shared>(std::move(edge))); + CXXGraph::Graph graph_cycle(std::move(edgeSet)); + ASSERT_EQ(graph_cycle.isCyclicDirectedGraphBFS(), true); +}