• LeetCode: Clone Graph


    LeetCode: Clone Graph

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


    OJ's undirected graph serialization:

    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
             / 
             \_/
    
    地址:https://oj.leetcode.com/problems/clone-graph/
    算法:把整个图复制下来,基本就是利用map来完成的,复制的过程采用递归完成。代码:
     1 /**
     2  * Definition for undirected graph.
     3  * struct UndirectedGraphNode {
     4  *     int label;
     5  *     vector<UndirectedGraphNode *> neighbors;
     6  *     UndirectedGraphNode(int x) : label(x) {};
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
    12         if(!node){
    13             return NULL;
    14         }
    15         map<int,UndirectedGraphNode *> hash_table;
    16         set<int> isTraved;
    17         return subClone(node,hash_table,isTraved);
    18     }
    19     UndirectedGraphNode *subClone(UndirectedGraphNode *node, map<int,UndirectedGraphNode*> &hash_table, set<int> &isTraved){
    20         if(!node){
    21             return NULL;
    22         }
    23         int label = node->label;
    24         if(isTraved.find(label) != isTraved.end()){
    25             return hash_table[label];
    26         }
    27         if(hash_table.find(label) == hash_table.end()){
    28             hash_table[label] = new UndirectedGraphNode(label);
    29         }
    30         isTraved.insert(label);
    31         UndirectedGraphNode *p = hash_table[label];
    32         vector<UndirectedGraphNode *>::iterator it = node->neighbors.begin();
    33         for(; it != node->neighbors.end(); ++it){
    34             p->neighbors.push_back(subClone(*it,hash_table,isTraved));
    35         }
    36         return p;
    37     }
    38 };

     

  • 相关阅读:
    原理Lambda表达式
    关于Web.config的debug和release.config文件
    利用GeoIP数据库及API进行地理定位查询 Java
    JSONP跨域的原理解析
    如何处理JSON中的特殊字符
    IIS下防止mdb数据库被下载的实现方法
    点击文字选中radio
    关于微信40029错误
    nopcommerce的WidgetZones
    js判断移动终端(手机浏览器)
  • 原文地址:https://www.cnblogs.com/boostable/p/leetcode_clone_graph.html
Copyright © 2020-2023  润新知