Lintcode 137. 克隆图
题目描述:克隆一张无向图. 无向图的每个节点包含一个 label 和一个列表 neighbors. 保证每个节点的 label 互不相同.
你的程序需要返回一个经过深度拷贝的新图. 新图和原图具有同样的结构, 并且对新图的任何改动不会对原图造成任何影响.
小知识深度拷贝的意思:复制数组的内容,而不是复制其引用,复制引用一般称为软拷贝。
解题思路:
- 从一个节点出发找到所有节点。
- 拷贝节点
- 拷贝边(连接关系)
/**
* 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) {
if (!node) {
return nullptr;
}
UndirectedGraphNode* oldnode = node;
UndirectedGraphNode* newnode = new UndirectedGraphNode(node->label);
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> old2newMap;//旧节点与新节点间建立映射
queue<UndirectedGraphNode*> graphQueue;
graphQueue.push(node);
old2newMap[node] = newnode;
//BFS寻找所有点
while (!graphQueue.empty()) {
oldnode = graphQueue.front();
newnode = old2newMap[oldnode];//复制节点
graphQueue.pop();
for (int i = 0; i < oldnode->neighbors.size(); ++i) {
UndirectedGraphNode* nb = oldnode->neighbors[i];
if (old2newMap.count(nb)) {
newnode->neighbors.push_back(old2newMap[nb]);//复制边(连接关系)
} else {
UndirectedGraphNode* tmp = new UndirectedGraphNode(nb->label);
newnode->neighbors.push_back(tmp);//作为newnode邻居
old2newMap[nb] = tmp;//与旧节点中的nb建立映射
graphQueue.push(nb);
}
}
}
return old2newMap[node];
}
};