Skip to content

Commit d9a526e

Browse files
committed
feature: ham cycle logic added
1 parent 058ae9d commit d9a526e

File tree

2 files changed

+100
-2
lines changed

2 files changed

+100
-2
lines changed

Headers/0003_Graph/0005_HamiltonianPathAndCycle.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

33
#include<map>
4-
#include<list>
4+
#include<unordered_set>
55
#include<vector>
66
using namespace std;
77

@@ -18,11 +18,16 @@ class HamiltonianGraph
1818
private:
1919
bool isHamiltonianCyclePresent;
2020
bool isHamiltonianPathPresent;
21-
map<HamiltonianNode*, list<HamiltonianNode*>> _adjlist;
21+
int visitedNodeCount;
22+
map<HamiltonianNode*, unordered_set<HamiltonianNode*>> _adjlist;
2223
map<int, HamiltonianNode*> _nodeMap;
24+
vector<HamiltonianNode*> _hamiltonianPath;
2325
HamiltonianNode* MakeOrFindNode(int value);
26+
bool IsSafe(HamiltonianNode* nodeU, HamiltonianNode* nodeV);
27+
bool HamiltonianCycleAndPathUtil(HamiltonianNode* node);
2428

2529
public:
2630
void PushUndirectedEdge(int valueU, int valueV);
2731
void PushSingleNode(int valueU);
32+
void FindHamiltonianCycleAndPath();
2833
};
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#include "../Headers/0003_Graph/0005_HamiltonianPathAndCycle.h"
2+
3+
using namespace std;
4+
5+
HamiltonianNode::HamiltonianNode(int value)
6+
{
7+
this->data = value;
8+
this->isVisited = false;
9+
}
10+
11+
// HamiltonianGraph Private Member Methods
12+
HamiltonianNode* HamiltonianGraph::MakeOrFindNode(int value)
13+
{
14+
HamiltonianNode* node = nullptr;
15+
if (this->_nodeMap.find(value) == this->_nodeMap.end())
16+
{
17+
node = new HamiltonianNode(value);
18+
this->_nodeMap[value] = node;
19+
}
20+
else
21+
{
22+
node = this->_nodeMap[value];
23+
}
24+
return node;
25+
}
26+
27+
bool HamiltonianGraph::IsSafe(HamiltonianNode* nodeU, HamiltonianNode* nodeV)
28+
{
29+
if (this->_adjlist[nodeU].find(nodeV) == this->_adjlist[nodeU].end())
30+
{
31+
return false;
32+
}
33+
if (nodeV->isVisited == true)
34+
{
35+
return false;
36+
}
37+
return true;
38+
}
39+
40+
bool HamiltonianGraph::HamiltonianCycleAndPathUtil(HamiltonianNode* nodeU)
41+
{
42+
if (this->visitedNodeCount == this->_nodeMap.size()-1)
43+
{
44+
if (this->_adjlist[nodeU].find(this->_hamiltonianPath[0]) != this->_adjlist[nodeU].end())
45+
{
46+
this->isHamiltonianCyclePresent = true;
47+
return true;
48+
}
49+
this->isHamiltonianPathPresent = true;
50+
return false;
51+
}
52+
for (auto& iterator : this->_nodeMap)
53+
{
54+
if (this->IsSafe(nodeU, iterator.second))
55+
{
56+
this->_hamiltonianPath.push_back(iterator.second);
57+
iterator.second->isVisited = true;
58+
this->visitedNodeCount++;
59+
if (this->HamiltonianCycleAndPathUtil(iterator.second))
60+
{
61+
return true;
62+
}
63+
this->_hamiltonianPath.pop_back();
64+
iterator.second->isVisited = false;
65+
this->visitedNodeCount--;
66+
}
67+
}
68+
return false;
69+
}
70+
71+
// HamiltonianGraph Public Member Methods
72+
void HamiltonianGraph::PushUndirectedEdge(int valueU, int valueV)
73+
{
74+
HamiltonianNode* nodeU = this->MakeOrFindNode(valueU);
75+
HamiltonianNode* nodeV = this->MakeOrFindNode(valueV);
76+
77+
this->_adjlist[nodeU].insert(nodeV);
78+
this->_adjlist[nodeV].insert(nodeU);
79+
}
80+
81+
void HamiltonianGraph::PushSingleNode(int valueU)
82+
{
83+
HamiltonianNode* nodeU = this->MakeOrFindNode(valueU);
84+
}
85+
86+
void HamiltonianGraph::FindHamiltonianCycleAndPath()
87+
{
88+
HamiltonianNode* node = this->_nodeMap[0];
89+
this->_hamiltonianPath.push_back(node);
90+
node->isVisited = true;
91+
this->visitedNodeCount = 1;
92+
this->HamiltonianCycleAndPathUtil(node);
93+
}

0 commit comments

Comments
 (0)