[LeetCode] Clone Graph
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 #
.
First node is labeled as
0
. Connect node0
to both nodes1
and2
.Second node is labeled as
1
. Connect node1
to node2
.Third node is labeled as
2
. Connect node2
to node2
(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: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if(node==NULL){ return NULL; } map<int, UndirectedGraphNode*> nodeMap; //存的是新图的标签到节点指针对 queue<UndirectedGraphNode*> nodeQ; //存的是原图的节点指针 UndirectedGraphNode* newNode = new UndirectedGraphNode(node->label); nodeMap[node->label] = newNode; nodeQ.push(node); while(!nodeQ.empty()){ UndirectedGraphNode* n = nodeQ.front(); nodeQ.pop(); for(int i=0; i<n->neighbors.size(); i++){ if(nodeMap.find(n->neighbors[i]->label) == nodeMap.end()){ nodeMap[n->neighbors[i]->label] = new UndirectedGraphNode(n->neighbors[i]->label); nodeQ.push(n->neighbors[i]); } nodeMap[n->label]->neighbors.push_back(nodeMap[n->neighbors[i]->label]); } } return newNode; } };
0 条评论