美文网首页
Clone Graph (Leetcode 133)

Clone Graph (Leetcode 133)

作者: stepsma | 来源:发表于2016-11-07 01:37 被阅读0次

    DFS Approach:

    注意,对于DFS,对map的赋值要在DFS loop开始以前。这样可以避免由于graph有loop而造成的死循环。

    Key Point:如果graph有环,将map的赋值建立在loop之前。

    /**
     * Definition for undirected graph.
     * struct UndirectedGraphNode {
     *     int label;
     *     vector<UndirectedGraphNode *> neighbors;
     *     UndirectedGraphNode(int x) : label(x) {};
     * };
     */
    class Solution {
    public:
        unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if(!node) return NULL;
            else if(mp.count(node)) return mp[node];
            
            auto node_copy = new UndirectedGraphNode(node->label);
            mp[node] = node_copy;
            for(auto it : node->neighbors){
                node_copy->neighbors.push_back(cloneGraph(it));
            }
            return mp[node];
        }
    };
    

    BFS Approach:
    虽然长,但BFS写起来也很简单。而且可以避免死循环,以及stack overflow。还是尽量用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) return NULL;
            unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
            queue<UndirectedGraphNode*> q;
            
            auto *node_copy = new UndirectedGraphNode(node->label);
            mp[node] = node_copy;
            q.push(node);
            
            while(!q.empty()){
                auto cur = q.front(); q.pop();
                auto *cur_copy = mp[cur];
                mp[cur] = cur_copy;
                for(auto it :  cur->neighbors){
                    if(mp.count(it)){
                        cur_copy->neighbors.push_back(mp[it]);
                    }
                    else{
                        auto it_copy = new UndirectedGraphNode(it->label);
                        mp[it] = it_copy;
                        cur_copy->neighbors.push_back(it_copy);
                        q.push(it);
                    }
                }
                
            }
            return mp[node];
        }
    };
    

    相关文章

      网友评论

          本文标题:Clone Graph (Leetcode 133)

          本文链接:https://www.haomeiwen.com/subject/khgnuttx.html