克隆一张无向图,图中的每个节点包含一个 label
和一个列表 neighbors
。
数据中如何表示一个无向图?http://www.lintcode.com/help/graph/
你的程序需要返回一个经过深度拷贝的新图。这个新图和原图具有同样的结构,并且对新图的任何改动不会对原图造成任何影响。
样例
比如,序列化图 {0,1,2#1,2#2,2}
共有三个节点, 因此包含两个个分隔符#。
- 第一个节点label为0,存在边从节点0链接到节点1和节点2
- 第二个节点label为1,存在边从节点1连接到节点2
- 第三个节点label为2,存在边从节点2连接到节点2(本身),从而形成自环。
我们能看到如下的图:
1
/ \
/ \
0 --- 2
/ \
\_/
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
/*
* @param node: A undirected graph node
* @return: A undirected graph node
*/
UndirectedGraphNode* cloneGraph(UndirectedGraphNode* node) {
// write your code here
if (node == NULL) {
return NULL;
}
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> maps;
queue<UndirectedGraphNode*> qu;
UndirectedGraphNode* new_head = NULL;
// visit all nodes: BFS
qu.push(node);
while (!qu.empty()) {
UndirectedGraphNode* nd = qu.front();
qu.pop();
UndirectedGraphNode* new_nd = new UndirectedGraphNode(nd->label);
maps[nd] = new_nd;
if (new_head == NULL) {
new_head = new_nd; // set new head
}
for (int i = 0; i < nd->neighbors.size(); i++) {
if (maps.find(nd->neighbors[i]) == maps.end()) {
qu.push(nd->neighbors[i]);
}
}
}
// setup graph
for (unordered_map<UndirectedGraphNode*, UndirectedGraphNode*>::iterator iter = maps.begin();
iter != maps.end(); iter++) {
UndirectedGraphNode* old_nd = iter->first;
UndirectedGraphNode* new_nd = iter->second;
for (int i = 0; i < old_nd->neighbors.size(); i++) {
new_nd->neighbors.push_back(maps[old_nd->neighbors[i]]);
}
}
return new_head;
}
};