Clone Graph 克隆圖
阿新 • • 發佈:2018-12-10
克隆一張無向圖,圖中的每個節點包含一個 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; } };