(Leetcode) [Graph] Clone graph, and BFS
Question
Given a reference of a node in a connected undirected graph, return a deep copy (clone) of the graph.
Each node in the graph contains a value and a list of its neighbors.
class Node {
public int val;
public List<Node> neighbors;
}
Solution
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> neighbors;
Node() {
val = 0;
neighbors = vector<Node*>();
}
Node(int _val) {
val = _val;
neighbors = vector<Node*>();
}
Node(int _val, vector<Node*> _neighbors) {
val = _val;
neighbors = _neighbors;
}
};
Node* cloneGraph(Node* node) {
if (node==nullptr)
return nullptr;
// map to keep track of all the nodes which have already been created
map<Node*, Node*> copies;
queue<Node*> q;
q.push(node);
// copy without its neighbours
Node* copy = new Node(node->val, {});
// key = address of original node
// value = address of new node
copies[node] = copy;
while (!q.empty()) {
Node* u = q.front();
q.pop();
vector<Node*> v = u->neighbors;
for (int i=0; i<v.size(); i++) {
if (copies[v[i]]==nullptr) { // prevents duplicated copies of a node
copies[v[i]] = new Node(v[i]->val, {});
q.push(v[i]);
}
copies[u]->neighbors.push_back(copies[v[i]]);
}
}
return copies[node];
}
ํด๋์ค ๋ฑ์ฅ๊ณผ ๊ทธ๋ํ์ ์ต์ํ์ง ์์ ๋ถ๋ถ ๋๋ฌธ์ ์ง๋ ๊ฒ์ ๋จน๊ณ ๊ฑฐ์ ๋ฐ๋ก geeksforgeeks์ ์ฐพ์๋ดค๋ค. ์ฌ์ค ๊ทธ๋ํ๋ ์ ๋ฒ ํ๊ธฐ COMP2711 (Discrete mathematics for computer science) ์์ ์ ๋ค์ผ๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ์ตํ๋ค.
์ด ๋ฌธ์ ์์ ๊ฐ์ฅ ์ถ์ด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ BFS (Breadth-First Search)์ด๋ค.
์ด๋ค ํ ๊ฐ์ node๋ฅผ ์์์ ์ผ๋ก ์ ํด์ ๋ชจ๋ node๋ฅผ traverse ํ๋๋ก ํ ์ ์๋ค.
์ด ๋ฌธ์ ์์์ ์ค์ ์ node๋ฅผ ๋ค๋ฅผ๋๋ง๋ค ๋ณต์ ๋ฅผ ํ๋๋ฐ, ์ด๋ฏธ ๋ณต์ ํ node๋ฅผ ์ฌ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ์ ๋์ด๊ฐ๊ฒ๋ ํด์ค์ผ ํ๋ค. ์ด๊ฑด ๋
ธ๋๋ฅผ ๋ณต์ ํ ๋๋ง๋ค map์ ์ ์ฅ์ ํ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
How to keep track of the visited/cloned nodes?
Use of hashmap/map
. Before adding a node into the map, check if it is already stored in the map.
Key: Address of original node.
Value: Address of cloned node.
How to connect clone nodes?
- Visit all the neighboring nodes for a node
copy
. - For each neighbor of
copy
find the corresponding clone node. If not found, create one. - Push the cloned neighbor into the neighboring vector of cloned version of
copy
.
BFS (Breadth-First Search)
์์ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ ์์ ๋
ธ๋์ ์๋ ์ธ์ ํ ๋ชจ๋ ๋
ธ๋๋ค์ ๋ฐฉ๋ฌธํ๋ ๋ฐฉ๋ฒ.
๋ ์ด์ ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋๊ฐ ์์ ๋๊น์ง BFS๊ฐ ์ ์ฉ์ด ๋๋ค.
Queue ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค. Queue์๋ ์ธ์ ๋
ธ๋๋ค(neighboring nodes)์ด ์ ์ฅ ๋๋ค.
์ฅ์
- ์ถ๋ฐ ๋ ธ๋์์ ๋ชฉํ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ธธ์ด ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅ.
๋จ์
- ๊ฒฝ๋ก๊ฐ ๋งค์ฐ ๊ธธ ๊ฒฝ์ฐ์๋ ํ์ ๊ฐ์ง๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ณด๋ค ๋ง์ ๊ธฐ์ต ๊ณต๊ฐ์ ํ์.
- ํด๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ ํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ, ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ํ์ํ ํ์ ์คํจ๋ก ๋๋๋ค.
- ๋ฌดํ ๊ทธ๋ํ์ ๊ฒฝ์ฐ์๋ ๊ฒฐ์ฝ ํด๋ฅผ ์ฐพ์ง๋ ๋ชปํ๊ณ , ๋๋ด์ง๋ ๋ชปํ๋ค.
Leave a comment