DFS
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
using UMAP = unordered_map<UndirectedGraphNode*, UndirectedGraphNode*>;
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == nullptr) return nullptr;
UMAP mp;
return reSolver(node, mp);
}
private:
UndirectedGraphNode *reSolver(UndirectedGraphNode * node, UMAP& mp) {
UndirectedGraphNode *ret = new UndirectedGraphNode(node->label);
mp[node] = ret;
for (auto p : node->neighbors) {
auto it = mp.begin();
if ((it = mp.find(p)) != mp.end())
ret->neighbors.emplace_back(it->second);
else
ret->neighbors.emplace_back(reSolver(p, mp));
}
return ret;
}
};
BFS
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (node == nullptr) return nullptr;
UndirectedGraphNode* ret = new UndirectedGraphNode(node->label);
using UMAP = unordered_map<UndirectedGraphNode*, UndirectedGraphNode*>;
UMAP mp {make_pair(node, ret)};
deque<UndirectedGraphNode*> dp;
dp.emplace_back(node);
while (!dp.empty()) {
size_t n = dp.size();
for (int i = 0; i != n; ++i) {
auto pSrc = dp.front();
dp.pop_front();
auto pDst = mp[pSrc];
for (auto p : pSrc->neighbors) {
auto it = cbegin(mp);
if ((it = mp.find(p)) != cend(mp))
pDst->neighbors.emplace_back(it->second);
else {
auto tmp = new UndirectedGraphNode(p->label);
mp[p] = tmp;
pDst->neighbors.emplace_back(tmp);
dp.emplace_back(p);
}
}
}
}
return ret;
}
};