您的位置:首页 > 其它

LeetCode133. Clone Graph

2016-03-22 20:04 204 查看

题目:

https://leetcode.com/problems/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 node 0 to both nodes 1 and 2.

Second node is labeled as 1. Connect node 1 to node 2.

Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

Visually, the graph looks like the following:

1
/ \
/   \
0 --- 2
/ \
\_/


思路:

题意:克隆一个图。

BFS遍历图,一边遍历,一边完成克隆。用map记录原来图的节点和克隆图的节点情况,防止克隆过的节点再被new一次。每copy一个原节点,就把原节点与克隆节点放入map中,原节点与克隆节点对应。如果后面的遍历遇到在map中的原节点,表明这个原节点已经被copy过了,不用新new一个节点来再次copy。

代码:

/**
* 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;
}
UndirectedGraphNode* cur=NULL;
UndirectedGraphNode* start=NULL;
UndirectedGraphNode* connect=NULL;
queue<UndirectedGraphNode*> q;
q.push(node);
unordered_map<UndirectedGraphNode*,UndirectedGraphNode*> m;
start=new UndirectedGraphNode (node->label);
m[node]=start;
while(!q.empty()){
cur=q.front();
q.pop();
int len=cur->neighbors.size();
for(int i=0;i<len;i++){
connect=cur->neighbors[i];
if(m.find(connect)==m.end()){
UndirectedGraphNode* nodeCopy=new UndirectedGraphNode(connect->label);
m[connect]=nodeCopy;
q.push(connect);
}
m[cur]->neighbors.push_back(m[connect]);//与原节点对应的克隆节点添加相邻节点
}
}
return start;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs 图论