Clone an undirected graph. each node in the graph containslabelAnd a list of itsneighbors.
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#.
- First node is labeled
0. Connect Node0To both nodes1And2.
- Second node is labeled
1. Connect Node1To Node2.
- Third node is labeled
2. Connect Node2To Node2(Itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1 / / 0 --- 2 / \_/
/** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector<UndirectedGraphNode *> neighbors; * UndirectedGraphNode(int x) : label(x) {}; * }; */struct UndirectedGraphNode{int label;std::vector<UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {};};class Solution {public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {std::unordered_map<UndirectedGraphNode*, UndirectedGraphNode *> map; if(node == NULL) return node;return dfs(node,map); }private:UndirectedGraphNode *dfs(UndirectedGraphNode *node,std::unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> &map){if(map.count(node) > 0) return map[node];UndirectedGraphNode *newNode = new UndirectedGraphNode(node->label);map[node] = newNode;for(int i = 0; i < node->neighbors.size(); i++){newNode->neighbors.push_back(dfs(node->neighbors[i],map));}return newNode;}};
Leetcode-clone Graph