1. 程式人生 > >Clone Graph 克隆圖

Clone Graph 克隆圖

克隆一張無向圖,圖中的每個節點包含一個 label (標籤)和一個 neighbors (鄰接點)列表 。

OJ的無向圖序列化:

節點被唯一標記。

我們用 # 作為每個節點的分隔符,用 , 作為節點標籤和鄰接點的分隔符。

例如,序列化無向圖 {0,1,2#1,2#2,2}

該圖總共有三個節點, 被兩個分隔符  # 分為三部分。 

  1. 第一個節點的標籤為 0,存在從節點 0 到節點 1 和節點 2 的兩條邊。
  2. 第二個節點的標籤為 1,存在從節點 1 到節點 2 的一條邊。
  3. 第三個節點的標籤為 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;
 }
};