Clone Graph
Clone an undirected graph. Each node in the graph contains a label
and a list of its neighbors
.
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 #
.
0
. Connect node 0
to
both nodes 1
and 2
.1
. Connect node 1
to
node 2
.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: 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; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/kangrydotnet/article/details/47704051