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