图:基础
睡不醒的鲤鱼 2022-05-19 每日一题 LeetCode
# 0133. 克隆图 (opens new window)
题目
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val
(int
) 和其邻居的列表(list[Node]
)。
class Node {
public int val;
public List<Node> neighbors;
}
1
2
3
4
2
3
4
先通过 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 {
unordered_map<Node*, Node*> h;
public:
Node* cloneGraph(Node* node) {
if (!node) return nullptr;
dfs(node);
for (auto [from, to]: h) {
for (auto next: from->neighbors) {
to->neighbors.push_back(h[next]);
}
}
return h[node];
}
void dfs(Node* node) {
h[node] = new Node(node->val);
for (auto next: node->neighbors) {
if (!h[next]) dfs(next);
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42