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
/ \_/
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { //c++ if(node == NULL) return NULL; set<int> visited; map<int,UndirectedGraphNode*> myMap; queue<UndirectedGraphNode*> myQueue; UndirectedGraphNode *head,*p,*temp,*one; myQueue.push(node); bool isFirst = true; do { p = myQueue.front(); if(isFirst){ temp = new UndirectedGraphNode(p->label); head= temp; myMap.insert(make_pair(p->label,temp)); isFirst = false; } else temp = myMap[p->label]; vector<UndirectedGraphNode*> vec; for(int i=0; i<(p->neighbors).size(); i++){ int label =(p->neighbors)[i]->label; if(myMap.count(label)!=0) one = myMap[label]; else { one = new UndirectedGraphNode(label); myMap.insert(make_pair(label,one)); } vec.push_back(one); if(visited.count(label)==0) myQueue.push(p->neighbors[i]); } temp->neighbors = vec; myQueue.pop(); visited.insert(p->label); }while(!myQueue.empty()); return head; }
原文地址:http://blog.csdn.net/chenlei0630/article/details/42807633