133. Clone Graph

来源:互联网 发布:mac照片u盘导入win7 编辑:程序博客网 时间:2024/06/06 14:25

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

拷贝一个图,最先想到的就是DFS与BFS了,但是这个题目的一个关键问题是

如果图是  1--2   这种样子,    拷贝1,拷贝邻居2,拷贝2   这个时候出现了重复

所以利用unordered_map处理这个重复十分关键

BFS:

class Solution {public:    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {        if (!node) return NULL;        UndirectedGraphNode* copy = new UndirectedGraphNode(node -> label);        mp[node] = copy;        queue<UndirectedGraphNode*> toVisit;        toVisit.push(node);        while (!toVisit.empty()) {            UndirectedGraphNode* cur = toVisit.front();            toVisit.pop();            for (UndirectedGraphNode* neigh : cur -> neighbors) {                if (mp.find(neigh) == mp.end()) {                    UndirectedGraphNode* neigh_copy = new UndirectedGraphNode(neigh -> label);                    mp[neigh] = neigh_copy;                    toVisit.push(neigh);                }                mp[cur] -> neighbors.push_back(mp[neigh]);            }        }        return copy;     }private:    unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;};



DFS:

/** * 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 nullptr;        if(m.find(node)==m.end()){            m[node]=new UndirectedGraphNode(node->label);            for(UndirectedGraphNode* neigh:node->neighbors)                m[node]->neighbors.push_back(cloneGraph(neigh));        }        return m[node];    }private:    unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> m;};


原创粉丝点击