题目地址:
https://leetcode.com/problems/clone-graph/
深拷贝一个图。
思路是DFS。开一个Hashmap,存储原图顶点和新图顶点的对应关系。接着对图进行DFS即可。代码如下:
/*
// 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;
}
};
*/
class Solution {
public:
Node* cloneGraph(Node* node) {
if (!node) return nullptr;
unordered_map<Node*, Node*> mp;
mp[nullptr] = nullptr;
return dfs(node, mp);
}
// 返回原图中的node对应的新图的node
Node* dfs(Node* node, unordered_map<Node*, Node*>& mp) {
// 如果对应的新图的node已经建出来了,就直接返回
if (auto it = mp.find(node); it != mp.end()) return it->second;
// 如果没new出来,就将其new出来
mp[node] = new Node(node->val);
// new出来以后,将其邻居加入进去
for (auto* ne : node->neighbors) mp[node]->neighbors.push_back(dfs(ne, mp));
// 返回对应的新图的node
return mp[node];
}
};
时间复杂度 O ( V + E ) O(V+E) O(V+E),空间复杂度 O ( V ) O(V) O(V)。