您的位置:首页 > 其它

leetcode_题解_Clone Graph

2014-10-27 10:04 357 查看
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 
,
 asa 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 node 
0
 toboth nodes 
1
 and 
2
.Second node is labeled as 
1
. Connect node 
1
 tonode 
2
.Third node is labeled as 
2
. Connect node 
2
 tonode 
2
 (itself), thus forming a self-cycle.Visually, the graph looks like the following:
1
/ \
/   \
0 --- 2
/ \
\_/
思路:先bfs仅仅复制数值,并且生成一个映射表map;然后再bfs一下将各个节点链接起来。
/*** Definition for undirected graph.* struct UndirectedGraphNode {*     int label;*     vector<UndirectedGraphNode *> neighbors;*     UndirectedGraphNode(int x) : label(x) {};* };*/class Solution {public:void bfsCopyVal(UndirectedGraphNode *node, map<UndirectedGraphNode*,UndirectedGraphNode*> &addrMap){if(node==NULL)return ;map<UndirectedGraphNode*,bool> visMap;queue<UndirectedGraphNode*> nodeQueue;nodeQueue.push(node);while(!nodeQueue.empty()){UndirectedGraphNode *tmp=nodeQueue.front();nodeQueue.pop();//出队头UndirectedGraphNode *nNode=new UndirectedGraphNode(tmp->label);addrMap[tmp]=nNode;//建立旧到新的节点映射if(visMap[tmp]!=true){visMap[tmp]=true;for(vector<UndirectedGraphNode*>::iterator iter1=tmp->neighbors.begin(); iter1!=tmp->neighbors.end(); iter1++){nodeQueue.push(*iter1);//入队尾}}}}void bfsLinkNode(UndirectedGraphNode *node, map<UndirectedGraphNode*,UndirectedGraphNode*> &addrMap){if(node==NULL)return ;map<UndirectedGraphNode*,bool> visMap;queue<UndirectedGraphNode*> nodeQueue;nodeQueue.push(node);while(!nodeQueue.empty()){UndirectedGraphNode *tmp=nodeQueue.front();nodeQueue.pop();//出队头if(visMap[tmp]!=true){visMap[tmp]=true;vector<UndirectedGraphNode*> nVec;for(vector<UndirectedGraphNode*>::iterator iter1=tmp->neighbors.begin(); iter1!=tmp->neighbors.end(); iter1++){nodeQueue.push(*iter1);//入队尾nVec.push_back(addrMap[*iter1]);}addrMap[tmp]->neighb4000ors=nVec;}}}UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {map<UndirectedGraphNode*,UndirectedGraphNode*> addrMap;bfsCopyVal(node,addrMap);bfsLinkNode(node,addrMap);return addrMap[node];}};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  map leetcode bfs Clone Graph