LeetCode 133. Clone Graph

deep copy graph,图的问题。要copy首先要遍历,遍历图可以用dfs也可以bfs。

本题的关键在于,由于节点和节点之间连通,当前遍历的节点很可能之前就已经clone过了,此时就不需要再一次clone了,否则会出现问题。

因此,我们可以建立原节点与clone节点的映射,用一个unordered_map来保存。如果当前遍历的节点在其中,则直接返回 m[curNode] 即可。

 

DFS

class Solution {
public:
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> m;
    
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        if (node==NULL) return NULL;
        if (m.count(node)) return m[node];
        UndirectedGraphNode *newNode=new UndirectedGraphNode(node->label);
        m[node] = newNode;
        for (auto neighbor:node->neighbors){
            newNode->neighbors.push_back(cloneGraph(neighbor));
        }
        return newNode;
    }
};

 

BFS

BFS就没有DFS那么好写了。创建好node并建立好映射的原节点才会被Push到queue中。

当这些节点从queue中出来的时候,我们将把该节点的copy节点的neighbors数组处理完毕。此过程中,copy之前没有被copy的neighbor节点并建立映射,这写节点也将被push到queue中(等待出队列处理neighbors数组)。

class Solution {
public:
    unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> m;
    
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        if (node==NULL) return NULL;
        UndirectedGraphNode *copy=new UndirectedGraphNode(node->label);
        m[node] = copy;
        
        queue<UndirectedGraphNode *> q({node});
        while (!q.empty()){
            UndirectedGraphNode *cur=q.front(); q.pop();
            for (auto neighbor:cur->neighbors){
                if (!m.count(neighbor)){
                    UndirectedGraphNode *copy_neighbor=new UndirectedGraphNode(neighbor->label);
                    m[neighbor] = copy_neighbor;
                    q.push(neighbor);
                }
                m[cur]->neighbors.push_back(m[neighbor]);
            }
        }
        return copy;
    }
};

 

References:

https://leetcode.com/problems/clone-graph/discuss/42313/7-17-lines-C++-BFSDFS-Solutions

 

posted @ 2018-11-11 10:18  約束の空  阅读(129)  评论(0)    收藏  举报