图:基础

2022-05-19 每日一题 LeetCode

# 0133. 克隆图 (opens new window)

题目

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 valint) 和其邻居的列表(list[Node])。

class Node {
    public int val;
    public List<Node> neighbors;
}
1
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
Last Updated: 2023-01-28 4:31:25