LEEDCODE: Clone Graph

来源:互联网 发布:av杂志在淘宝上怎么买 编辑:程序博客网 时间:2024/05/17 02:50

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         / \         \_/

这题的重点是不要重复复制,所以我用map对每个节点做了映射。


/** * Definition for undirected graph. * struct UndirectedGraphNode { *     int label; *     vector<UndirectedGraphNode *> neighbors; *     UndirectedGraphNode(int x) : label(x) {}; * }; */class Solution {public:    map<UndirectedGraphNode *, UndirectedGraphNode *> themap;    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {        if(node == NULL)    return node;        themap.clear();        return cloneGraphInternal(node);    }    UndirectedGraphNode *cloneGraphInternal(UndirectedGraphNode *node) {        UndirectedGraphNode *ugn = new UndirectedGraphNode(node->label);        themap[node] = ugn;        for(int ii = 0; ii < node->neighbors.size(); ii ++) {            if(themap.count(node->neighbors[ii]) > 0) {                ugn->neighbors.push_back(themap[node->neighbors[ii]]);            }            else {                UndirectedGraphNode *ugn2 = cloneGraphInternal(node->neighbors[ii]);                themap[node->neighbors[ii]] = ugn2;                ugn->neighbors.push_back(themap[node->neighbors[ii]]);            }        }        return ugn;    }};




0 0
原创粉丝点击