Skip to content

Commit df4def9

Browse files
committed
core-test-feature: ham cycle, unitest helper
1 parent 33c90a7 commit df4def9

File tree

8 files changed

+103
-63
lines changed

8 files changed

+103
-63
lines changed

Headers/0003_Graph/0005_HamiltonianPathAndCycle.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ class HamiltonianNode
1616
class HamiltonianGraph
1717
{
1818
private:
19-
bool isHamiltonianCyclePresent;
20-
bool isHamiltonianPathPresent;
21-
int visitedNodeCount;
19+
bool _isHamiltonianCyclePresent;
20+
bool _isHamiltonianPathPresent;
21+
int _visitedNodeCount;
22+
HamiltonianNode* _startingNode;
2223
map<HamiltonianNode*, unordered_set<HamiltonianNode*>> _adjlist;
2324
map<int, HamiltonianNode*> _nodeMap;
24-
vector<HamiltonianNode*> _hamiltonianPath;
25+
vector<int> _hamiltonianPath;
2526
HamiltonianNode* MakeOrFindNode(int value);
2627
bool IsSafe(HamiltonianNode* nodeU, HamiltonianNode* nodeV);
2728
bool HamiltonianCycleAndPathUtil(HamiltonianNode* node);
@@ -32,6 +33,5 @@ class HamiltonianGraph
3233
void FindHamiltonianCycleAndPath();
3334
bool IsHamiltonianCyclePresent();
3435
bool IsHamiltonianPathPresent();
35-
vector<HamiltonianNode*> GetHamiltonianCycle();
36-
vector<HamiltonianNode*> GetHamiltonianPath();
36+
vector<int> GetHamiltonianPath();
3737
};

SourceCodes/0003_Graph/0005_HamiltonianPathAndCycle.cc

Lines changed: 23 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,29 +39,30 @@ bool HamiltonianGraph::IsSafe(HamiltonianNode* nodeU, HamiltonianNode* nodeV)
3939

4040
bool HamiltonianGraph::HamiltonianCycleAndPathUtil(HamiltonianNode* nodeU)
4141
{
42-
if (this->visitedNodeCount == this->_nodeMap.size()-1)
42+
if (this->_visitedNodeCount == this->_nodeMap.size())
4343
{
44-
if (this->_adjlist[nodeU].find(this->_hamiltonianPath[0]) != this->_adjlist[nodeU].end())
44+
if (this->_adjlist[nodeU].find(this->_startingNode) != this->_adjlist[nodeU].end())
4545
{
46-
this->isHamiltonianCyclePresent = true;
46+
this->_isHamiltonianCyclePresent = true;
47+
this->_isHamiltonianPathPresent = true;
4748
return true;
4849
}
49-
this->isHamiltonianPathPresent = true;
50+
this->_isHamiltonianPathPresent = true;
5051
return false;
5152
}
52-
for (auto& iterator : this->_nodeMap)
53+
for (auto& nodeV : this->_adjlist[nodeU])
5354
{
54-
if (this->IsSafe(nodeU, iterator.second))
55+
if (this->IsSafe(nodeU, nodeV))
5556
{
56-
this->_hamiltonianPath.push_back(iterator.second);
57-
iterator.second->isVisited = true;
58-
this->visitedNodeCount++;
59-
if (this->HamiltonianCycleAndPathUtil(iterator.second))
57+
this->_hamiltonianPath.push_back(nodeV->data);
58+
nodeV->isVisited = true;
59+
this->_visitedNodeCount++;
60+
if (this->HamiltonianCycleAndPathUtil(nodeV))
6061
{
6162
return true;
6263
}
63-
this->visitedNodeCount--;
64-
iterator.second->isVisited = false;
64+
this->_visitedNodeCount--;
65+
nodeV->isVisited = false;
6566
this->_hamiltonianPath.pop_back();
6667
}
6768
}
@@ -85,36 +86,27 @@ void HamiltonianGraph::PushSingleNode(int valueU)
8586

8687
void HamiltonianGraph::FindHamiltonianCycleAndPath()
8788
{
88-
this->isHamiltonianCyclePresent = false;
89-
this->isHamiltonianPathPresent = false;
89+
this->_isHamiltonianCyclePresent = false;
90+
this->_isHamiltonianPathPresent = false;
9091
this->_hamiltonianPath = {};
91-
HamiltonianNode* node = this->_nodeMap[0];
92-
this->_hamiltonianPath.push_back(node);
93-
node->isVisited = true;
94-
this->visitedNodeCount = 1;
95-
this->HamiltonianCycleAndPathUtil(node);
92+
this->_startingNode = this->_nodeMap[0];
93+
this->_hamiltonianPath.push_back(this->_startingNode->data);
94+
this->_startingNode->isVisited = true;
95+
this->_visitedNodeCount = 1;
96+
this->HamiltonianCycleAndPathUtil(this->_startingNode);
9697
}
9798

9899
bool HamiltonianGraph::IsHamiltonianCyclePresent()
99100
{
100-
return this->isHamiltonianCyclePresent;
101+
return this->_isHamiltonianCyclePresent;
101102
}
102103

103104
bool HamiltonianGraph::IsHamiltonianPathPresent()
104105
{
105-
return this->isHamiltonianPathPresent;
106+
return this->_isHamiltonianPathPresent;
106107
}
107108

108-
vector<HamiltonianNode*> HamiltonianGraph::GetHamiltonianCycle()
109-
{
110-
if (this->isHamiltonianCyclePresent)
111-
{
112-
this->_hamiltonianPath.push_back(this->_nodeMap[0]);
113-
}
114-
return this->_hamiltonianPath;
115-
}
116-
117-
vector<HamiltonianNode*> HamiltonianGraph::GetHamiltonianPath()
109+
vector<int> HamiltonianGraph::GetHamiltonianPath()
118110
{
119111
return this->_hamiltonianPath;
120112
}

Tests/0000_CommonUtilities/UnitTestHelper.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class UnitTestHelper
1010
{
1111
public:
1212
template<typename T>
13-
string VerifyVectorResult(vector<T> vector)
13+
string SerializeVectorToString(vector<T> vector)
1414
{
1515
string result = "";
1616
for (auto& iterator : vector)
@@ -22,7 +22,7 @@ class UnitTestHelper
2222
}
2323

2424
template<typename T>
25-
string VerifyVectorResult(vector<pair<T,T>> vector)
25+
string SerializeVectorToString(vector<pair<T,T>> vector)
2626
{
2727
string result = "";
2828
for (auto& iterator : vector)
@@ -38,7 +38,7 @@ class UnitTestHelper
3838
}
3939

4040
template<typename T>
41-
string VerifyVectorResult(vector<pair<T, pair<T, T>>> vector)
41+
string SerializeVectorToString(vector<pair<T, pair<T, T>>> vector)
4242
{
4343
string result = "";
4444
for (auto& iterator : vector)
@@ -54,7 +54,7 @@ class UnitTestHelper
5454
}
5555

5656
template<typename T>
57-
string VerifyVectorResult(vector<vector<T>> vector)
57+
string SerializeVectorToString(vector<vector<T>> vector)
5858
{
5959
string result = "";
6060
for (auto& iterator : vector)
@@ -107,4 +107,19 @@ class UnitTestHelper
107107

108108
return data;
109109
}
110+
111+
template<typename T>
112+
vector<T> NormalizeCycle(vector<T> data)
113+
{
114+
if (data.empty())
115+
{
116+
return {};
117+
}
118+
auto minimumElementIterator = min_element(data.begin(), data.end());
119+
long long startIndex = distance(data.begin(), minimumElementIterator);
120+
vector<T> normalizedCycle;
121+
normalizedCycle.insert(normalizedCycle.begin(), data.begin() + startIndex, data.end());
122+
normalizedCycle.insert(normalizedCycle.end(), data.begin(), data.begin() + startIndex);
123+
return normalizedCycle;
124+
}
110125
};

Tests/0002_Tree/0001_BinarySearchTreeTest.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace BinarySearchTreeTest
1515
bst.InsertNode(60);
1616

1717

18-
string actualResult = unitTestHelper.VerifyVectorResult(bst.GetRecursiveInorderTravesalResult());
18+
string actualResult = unitTestHelper.SerializeVectorToString(bst.GetRecursiveInorderTravesalResult());
1919
string expectedResult = "30 50 60";
2020

2121
EXPECT_EQ(actualResult, expectedResult);
@@ -28,7 +28,7 @@ namespace BinarySearchTreeTest
2828
bst.InsertNode(30);
2929
bst.InsertNode(60);
3030

31-
string actualResult = unitTestHelper.VerifyVectorResult(bst.GetRecursivePreorderTravesalResult());
31+
string actualResult = unitTestHelper.SerializeVectorToString(bst.GetRecursivePreorderTravesalResult());
3232
string expectedResult = "50 30 60";
3333

3434
EXPECT_EQ(actualResult, expectedResult);
@@ -41,7 +41,7 @@ namespace BinarySearchTreeTest
4141
bst.InsertNode(30);
4242
bst.InsertNode(60);
4343

44-
string actualResult = unitTestHelper.VerifyVectorResult(bst.GetRecursivePostorderTravesalResult());
44+
string actualResult = unitTestHelper.SerializeVectorToString(bst.GetRecursivePostorderTravesalResult());
4545
string expectedResult = "30 60 50";
4646

4747
EXPECT_EQ(actualResult, expectedResult);
@@ -55,7 +55,7 @@ namespace BinarySearchTreeTest
5555
bst.InsertNode(60);
5656

5757

58-
string actualResult = unitTestHelper.VerifyVectorResult(bst.GetMorrisInorderTraversalResult());
58+
string actualResult = unitTestHelper.SerializeVectorToString(bst.GetMorrisInorderTraversalResult());
5959
string expectedResult = "30 50 60";
6060

6161
EXPECT_EQ(actualResult, expectedResult);
@@ -69,7 +69,7 @@ namespace BinarySearchTreeTest
6969
bst.InsertNode(60);
7070

7171

72-
string actualResult = unitTestHelper.VerifyVectorResult(bst.GetMorrisPreorderTraversalResult());
72+
string actualResult = unitTestHelper.SerializeVectorToString(bst.GetMorrisPreorderTraversalResult());
7373
string expectedResult = "50 30 60";
7474

7575
EXPECT_EQ(actualResult, expectedResult);
@@ -83,7 +83,7 @@ namespace BinarySearchTreeTest
8383
bst.InsertNode(60);
8484

8585

86-
string actualResult = unitTestHelper.VerifyVectorResult(bst.GetMorrisPostorderTraversalResult());
86+
string actualResult = unitTestHelper.SerializeVectorToString(bst.GetMorrisPostorderTraversalResult());
8787
string expectedResult = "30 60 50";
8888

8989
EXPECT_EQ(actualResult, expectedResult);

Tests/0003_Graph/0001_BreadthFirstSearchTest.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace BreadthFirstSearchTest
2525

2626
graph.BFS(1);
2727

28-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowBFSResult());
28+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowBFSResult());
2929
string expectedResult = "1(0) 2(1) 3(1) 4(2) 5(2) 6(2) 7(3) 8(3)";
3030
EXPECT_EQ(actualResult, expectedResult);
3131
}
@@ -38,7 +38,7 @@ namespace BreadthFirstSearchTest
3838

3939
graph.BFS(1);
4040

41-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowBFSResult());
41+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowBFSResult());
4242
string expectedResult = "1(0) 2(1)";
4343
EXPECT_EQ(actualResult, expectedResult);
4444
}

Tests/0003_Graph/0002_DepthFirstSearchTest.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ namespace DepthFirstSearchTest
2121

2222
graph.DFS();
2323

24-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
24+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
2525
string expectedResult = "1(1,8) 2(2,7) 3(9,12) 4(4,5) 5(3,6) 6(10,11)";
2626
EXPECT_EQ(actualResult, expectedResult);
2727
}
@@ -35,7 +35,7 @@ namespace DepthFirstSearchTest
3535

3636
graph.DFS();
3737

38-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
38+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
3939
string expectedResult = "1(1,2)";
4040
EXPECT_EQ(actualResult, expectedResult);
4141
}
@@ -49,7 +49,7 @@ namespace DepthFirstSearchTest
4949

5050
graph.DFS();
5151

52-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
52+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
5353
string expectedResult = "1(1,4) 2(2,3) 3(5,8) 4(6,7)";
5454
EXPECT_EQ(actualResult, expectedResult);
5555
}
@@ -64,7 +64,7 @@ namespace DepthFirstSearchTest
6464

6565
graph.DFS();
6666

67-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
67+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
6868
string expectedResult = "1(1,6) 2(2,5) 3(3,4)";
6969
EXPECT_EQ(actualResult, expectedResult);
7070
}
@@ -92,7 +92,7 @@ namespace DepthFirstSearchTest
9292

9393
graph.DFS();
9494

95-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
95+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
9696
string expectedResult = "1(1,32) 2(2,29) 3(30,31) 4(3,28) 5(4,27) 6(5,26) 7(6,25) 8(7,24) 9(8,23) 10(9,22) 11(10,21) 12(11,20) 13(12,19) 14(13,18) 15(14,17) 16(15,16)";
9797
EXPECT_EQ(actualResult, expectedResult);
9898
}
@@ -108,7 +108,7 @@ namespace DepthFirstSearchTest
108108

109109
graph.DFS();
110110

111-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
111+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
112112
string expectedResult = "1(1,2) 2(3,4) 3(5,6)";
113113
EXPECT_EQ(actualResult, expectedResult);
114114
}
@@ -125,7 +125,7 @@ namespace DepthFirstSearchTest
125125

126126
graph.DFS();
127127

128-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
128+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
129129
string expectedResult = "1(1,8) 2(2,7) 3(3,4) 4(5,6)";
130130
EXPECT_EQ(actualResult, expectedResult);
131131
}
@@ -150,7 +150,7 @@ namespace DepthFirstSearchTest
150150

151151
graph.DFS();
152152

153-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
153+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
154154
string expectedResult = "1(1,8) 2(2,7) 3(3,6) 4(4,5)";
155155
EXPECT_EQ(actualResult, expectedResult);
156156
}
@@ -169,7 +169,7 @@ namespace DepthFirstSearchTest
169169

170170
graph.DFS();
171171

172-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowDFSResult());
172+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowDFSResult());
173173
string expectedResult = "1(1,6) 2(2,5) 3(3,4)";
174174
EXPECT_EQ(actualResult, expectedResult);
175175
}

Tests/0003_Graph/0003_TopologicalSortTest.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace TopologicalSortTest
2323

2424
graph.TopologicalSort();
2525

26-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowTopologicalSortResult());
26+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowTopologicalSortResult());
2727
string expectedResult = "9(17,18) 6(11,16) 7(12,15) 8(13,14) 5(9,10) 1(1,8) 4(6,7) 2(2,5) 3(3,4)";
2828

2929
EXPECT_EQ(actualResult, expectedResult);
@@ -42,7 +42,7 @@ namespace TopologicalSortTest
4242
graph.PushDirectedEdge(6, 7);
4343

4444
graph.TopologicalSort();
45-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowTopologicalSortResult());
45+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowTopologicalSortResult());
4646
string expectedResult = "1(1,14) 3(12,13) 2(2,11) 4(3,10) 5(4,9) 6(5,8) 7(6,7)";
4747

4848
EXPECT_EQ(actualResult, expectedResult);
@@ -57,7 +57,7 @@ namespace TopologicalSortTest
5757
graph.PushDirectedEdge(5, 6);
5858

5959
graph.TopologicalSort();
60-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowTopologicalSortResult());
60+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowTopologicalSortResult());
6161
string expectedResult = "5(9,12) 6(10,11) 3(5,8) 4(6,7) 1(1,4) 2(2,3)";
6262

6363
EXPECT_EQ(actualResult, expectedResult);
@@ -72,7 +72,7 @@ namespace TopologicalSortTest
7272
graph.PushDirectedEdge(3, 4);
7373

7474
graph.TopologicalSort();
75-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowTopologicalSortResult());
75+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowTopologicalSortResult());
7676
string expectedResult = "2(7,8) 1(1,6) 3(2,5) 4(3,4)";
7777

7878
EXPECT_EQ(actualResult, expectedResult);
@@ -85,7 +85,7 @@ namespace TopologicalSortTest
8585
graph.PushSingleNode(1);
8686

8787
graph.TopologicalSort();
88-
string actualResult = unitTestHelper.VerifyVectorResult(graph.ShowTopologicalSortResult());
88+
string actualResult = unitTestHelper.SerializeVectorToString(graph.ShowTopologicalSortResult());
8989
string expectedResult = "1(1,2)";
9090

9191
EXPECT_EQ(actualResult, expectedResult);

0 commit comments

Comments
 (0)