• 【Lintcode】137.Clone Graph


    题目:

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

    How we serialize an undirected graph:

    Nodes are labeled uniquely.

    We use # as a separator for each node, and , as a separator for node label and each neighbor of the node.

    As an example, consider the serialized graph {0,1,2#1,2#2,2}.

    The graph has a total of three nodes, and therefore contains three parts as separated by #.

    1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
    2. Second node is labeled as 1. Connect node 1 to node 2.
    3. Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

    Visually, the graph looks like the following:

       1
      / 
     /   
    0 --- 2
         / 
         \_/

    Example

    return a deep copied graph.

    题解:

      DFS(recursion)

    Solution 1 ()

    class Solution {
    public:
        unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> hash;
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
           if (!node) return node;
           if(hash.find(node) == hash.end()) {
               hash[node] = new UndirectedGraphNode(node -> label);
               for (auto neighbor : node -> neighbors) {
                    (hash[node] -> neighbors).push_back( cloneGraph(neighbor) );
               }
           }
           return hash[node];
        }
    };

      DFS(stack)

    Solution 2 ()

    class Solution {
    public:
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if (node == nullptr) 
                return nullptr;
            stack<UndirectedGraphNode* > stack;
            
            map<int, UndirectedGraphNode* > visitTable;
            UndirectedGraphNode* newnode = new UndirectedGraphNode(node->label);
            visitTable[node->label] = newnode;
            stack.push(node);
            
            while (!stack.empty()) {
                UndirectedGraphNode* cur = stack.top();
                stack.pop();
                for (auto neighbor : cur->neighbors) {
                    if (visitTable.find(neighbor->label) == visitTable.end()) {
                        stack.push(neighbor);
                        UndirectedGraphNode* newneighbor = new UndirectedGraphNode(neighbor->label);
                        visitTable[neighbor->label] = newneighbor;
                    }
                    visitTable[cur->label]->neighbors.push_back(visitTable[neighbor->label]);
                }
            }
            
            return newnode;
        }
    };

      BFS

    Solution 3 ()

    class Solution {
    public:
        UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
            if (node == nullptr) 
                return nullptr;
            queue<UndirectedGraphNode* > queue;
            
            map<int, UndirectedGraphNode* > visitTable;
            UndirectedGraphNode* newnode = new UndirectedGraphNode(node->label);
            visitTable[node->label] = newnode;
            queue.push(node);
            
            while (!queue.empty()) {
                UndirectedGraphNode* cur = queue.front();
                queue.pop();
                for (auto neighbor : cur->neighbors) {
                    if (visitTable.find(neighbor->label) == visitTable.end()) {
                        UndirectedGraphNode* newneighbor = new UndirectedGraphNode(neighbor->label);
                        visitTable[neighbor->label] = newneighbor;
                        queue.push(neighbor);
                    }
                    visitTable[cur->label]->neighbors.push_back(visitTable[neighbor->label]);
                }
            }
            
            return newnode;
        }
    };
  • 相关阅读:
    挑战安全的捉迷藏病毒和木马的隐藏手段
    如何清除局域网中的ARP病毒
    挑战安全的捉迷藏病毒和木马的隐藏手段
    MS07027:Internet Explorer本月累积性安全更新
    对Autorun.inf类U盘病毒的攻防经验总结
    对Autorun.inf类U盘病毒的攻防经验总结
    如何清除局域网中的ARP病毒
    挂马方式和系统判断等代码
    linux下phpMyAdmin泛起1045 Access denied for 的措置
    在ubuntu8.04上用evolution接受163邮件
  • 原文地址:https://www.cnblogs.com/Atanisi/p/6858793.html
Copyright © 2020-2023  润新知