克隆一张无向图,图中的每个节点包含一个 label
(标签)和一个 neighbors
(邻接点)列表 。
OJ的无向图序列化:
节点被唯一标记。
我们用 #
作为每个节点的分隔符,用 ,
作为节点标签和邻接点的分隔符。
例如,序列化无向图 {0,1,2#1,2#2,2}
。
该图总共有三个节点, 被两个分隔符 #
分为三部分。
- 第一个节点的标签为
0
,存在从节点0
到节点1
和节点2
的两条边。 - 第二个节点的标签为
1
,存在从节点1
到节点2
的一条边。 - 第三个节点的标签为
2
,存在从节点2
到节点2
(本身) 的一条边,从而形成自环。
我们将图形可视化如下:
1 / \ / \ 0 --- 2 / \ \_/
思路:需要一个map来保存旧节点->新节点的映射关系,否则对于自循环的节点就会出现死循环,用递归就可以完成,如果映射关系已存在,就证明已经创建过这个节点,直接返回即可,否则逐个遍历每个元素及周围节点。
参考代码:
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> map_node;
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if (!node) return node;
if (map_node.find(node) != map_node.end()) return map_node[node];
UndirectedGraphNode* newnode = new UndirectedGraphNode(node->label);
vector<UndirectedGraphNode *> list;
map_node[node] = newnode;
for (int i = 0; i < node->neighbors.size(); i++) {
list.push_back(cloneGraph(node->neighbors[i]));
}
newnode->neighbors = list;
return newnode;
}
};