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