美文网首页
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];
    }
};

相关文章

  • Leetcode图

    133. 克隆图[https://leetcode-cn.com/problems/clone-graph/] 2...

  • Leetcode 133 Clone Graph

    解题报告 题目的要求是clone一个无向图。这个无向图的表达方式类似于adjacency list,但是不一样的地...

  • LeetCode 133 [Clone Graph]

    原题 克隆一张无向图,图中的每个节点包含一个 label 和一个表 neighbors。你的程序需要返回一个经过深...

  • Clone Graph (Leetcode 133)

    DFS Approach: 注意,对于DFS,对map的赋值要在DFS loop开始以前。这样可以避免由于grap...

  • Leetcode 133. Clone Graph

    题意:克隆一个无向图。 思路:因为是克隆所以需要一个map来存储克隆的映射关系,我们可以从给定的第一个节点向它的n...

  • LeetCode 133. Clone Graph

    Clone an undirected graph. Each node in the graph contain...

  • Leetcode133 Clone Graph

    Clone Graph Thinking 实现图的深拷贝. 就像图的遍历一样,也可以用深度优先搜索和宽度优先搜索进...

  • 【leetcode】No.133:clone-graph

    题目描述 Clone an undirected graph. Each node in the graph co...

  • 133. Clone Graph

    第一步加到map里面value是null只是为了去重,下一次遇到就不会进queue

  • 133. Clone Graph

网友评论

      本文标题:Clone Graph (Leetcode 133)

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