1+ #include " gtest/gtest.h"
2+ #include " CXXGraph.hpp"
3+
4+ TEST (UnionFindTest, test_1)
5+ {
6+ CXXGRAPH::Node<int > node0 (0 , 0 );
7+ CXXGRAPH::Node<int > node1 (1 , 1 );
8+ CXXGRAPH::Node<int > node2 (2 , 2 );
9+ CXXGRAPH::Node<int > node3 (3 , 3 );
10+
11+ /*
12+ 0
13+ 1 2
14+ 3
15+ */
16+ CXXGRAPH::UndirectedWeightedEdge<int > edge1 (0 , node0, node1, 5 );
17+ CXXGRAPH::UndirectedWeightedEdge<int > edge2 (1 , node0, node2, 10 );
18+ CXXGRAPH::UndirectedWeightedEdge<int > edge3 (2 , node1, node3, 5 );
19+
20+ std::list<const CXXGRAPH::Edge<int > *> edgeSet;
21+ edgeSet.push_back (&edge1);
22+
23+ CXXGRAPH::Graph<int > graph (edgeSet);
24+
25+ // every element is a subset of itself
26+ CXXGRAPH::Subset subset[4 ] = {{0 , 0 }, {1 , 0 }, {2 , 0 }, {3 , 0 }};
27+ auto res = graph.setFind (subset, node0.getId ());
28+ ASSERT_EQ (res, 0 );
29+ res = graph.setFind (subset, node1.getId ());
30+ ASSERT_EQ (res, 1 );
31+ res = graph.setFind (subset, node2.getId ());
32+ ASSERT_EQ (res, 2 );
33+
34+ // element 1 & 2 are subset of 0
35+ // element 3 is subset of 1
36+ CXXGRAPH::Subset subset1[4 ] = {{0 , 0 }, {0 , 0 }, {0 , 0 }, {1 , 0 }};
37+ auto res1 = graph.setFind (subset1, node0.getId ());
38+ ASSERT_EQ (res1, 0 );
39+ res = graph.setFind (subset1, node3.getId ());
40+ ASSERT_EQ (res1, 0 );
41+ res = graph.setFind (subset1, node2.getId ());
42+ ASSERT_EQ (res1, 0 );
43+
44+ // union of (node 1 & node3) should increase node0 rank by 1
45+ CXXGRAPH::Subset subset2[4 ] = {{0 , 0 }, {0 , 0 }, {0 , 0 }, {1 , 0 }};
46+ graph.setUnion (subset2, node1.getId (), node3.getId ());
47+ ASSERT_EQ (subset2[0 ].rank , 1 );
48+ ASSERT_EQ (subset2[3 ].parent , 0 );
49+
50+ // rank shouldn't increase since both have the same parent
51+ graph.setUnion (subset2, node2.getId (), node3.getId ());
52+ ASSERT_EQ (subset2[0 ].rank , 1 );
53+ ASSERT_EQ (subset2[3 ].parent , 0 );
54+ }
0 commit comments