clone-graph 1.0.0
Clone Graph
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1#include <bits/stdc++.h>
2
3using namespace std;
4
5// Definition for a Node.
6class Node
7{
8public:
9 int val;
10 vector<Node*> neighbors;
11
13 {
14 val = 0;
15 neighbors = vector<Node*>();
16 }
17
18 Node(int _val)
19 {
20 val = _val;
21 neighbors = vector<Node*>();
22 }
23
24 Node(int _val, vector<Node*> _neighbors)
25 {
26 val = _val;
27 neighbors = _neighbors;
28 }
29};
30
32{
33public:
34 void delete_graph(Node* node)
35 {
36 if (!node)
37 return;
38 set<Node*> visited;
39 queue<Node*> node_queue;
40 node_queue.push(node);
41 visited.insert(node);
42 while (!node_queue.empty())
43 {
44 Node* current = node_queue.front();
45 node_queue.pop();
46
47 for (Node* neighbor: current->neighbors)
48 {
49 if (neighbor && visited.find(neighbor) == visited.end())
50 {
51 node_queue.push(neighbor);
52 visited.insert(neighbor);
53 }
54 }
55 delete current;
56 }
57 }
58
62 void print_graph(Node* node)
63 {
64 if (!node)
65 return;
66 set<Node*> visited;
67 queue<Node*> node_queue;
68 node_queue.push(node);
69 visited.insert(node);
70 while (!node_queue.empty())
71 {
72 Node* current = node_queue.front();
73 node_queue.pop();
74
75 cout << "Node " << current->val << "; address: " << current << endl;
76 for (Node* neighbor: current->neighbors)
77 {
78 if (neighbor && visited.find(neighbor) == visited.end())
79 {
80 node_queue.push(neighbor);
81 visited.insert(neighbor);
82 }
83 }
84 }
85 }
86
88 {
89 if (!node)
90 return NULL;
91
92 unordered_map<Node*, Node*> node_map; // first node is the original node, second one is it's clone
93 queue<Node*> node_queue;
94
95 // cloning the source node
96 Node* new_node = new Node(node->val);
97
98 node_map[node] = new_node;
99 node_queue.push(node);
100
101 while (!node_queue.empty())
102 {
103 Node* current = node_queue.front();
104 node_queue.pop();
105
106 vector<Node*>& v = current->neighbors;
107 for (int i = 0; i < (int)v.size(); ++i)
108 {
109 if (node_map[v[i]] == NULL)
110 {
111 new_node = new Node(v[i]->val);
112 new_node->neighbors.reserve(2); // at least two reserved fields for the neighbors
113 node_map[v[i]] = new_node;
114 node_queue.push(v[i]);
115 }
116 node_map[current]->neighbors.push_back(node_map[v[i]]);
117 }
118 }
119 return node_map[node];
120 }
121};
122
123int main()
124{
125 Node* node_1 = new Node(1);
126 Node* node_2 = new Node(2);
127 Node* node_3 = new Node(3);
128 Node* node_4 = new Node(4);
129
130 node_1->neighbors.reserve(2);
131 node_2->neighbors.reserve(2);
132 node_3->neighbors.reserve(2);
133 node_4->neighbors.reserve(2);
134
135 node_1->neighbors.push_back(node_2);
136 node_1->neighbors.push_back(node_4);
137
138 node_2->neighbors.push_back(node_1);
139 node_2->neighbors.push_back(node_3);
140
141 node_3->neighbors.push_back(node_2);
142 node_3->neighbors.push_back(node_4);
143
144 node_4->neighbors.push_back(node_1);
145 node_4->neighbors.push_back(node_3);
146
147 Solution sol;
148 sol.print_graph(node_1);
149
150 Node* clone = sol.cloneGraph(node_1);
151 sol.print_graph(clone);
152
153 sol.delete_graph(node_1);
154 sol.delete_graph(clone);
155
156 return 0;
157}
Definition main.cpp:7
Node(int _val, vector< Node * > _neighbors)
Definition main.cpp:24
Node(int _val)
Definition main.cpp:18
int val
Definition main.cpp:9
Node()
Definition main.cpp:12
vector< Node * > neighbors
Definition main.cpp:10
Node * cloneGraph(Node *node)
Definition main.cpp:87
void print_graph(Node *node)
Prints graph nodes of a connected node using BFS.
Definition main.cpp:62
void delete_graph(Node *node)
Definition main.cpp:34
int main()
Definition main.cpp:123