1. 程式人生 > >LeetCode133 克隆圖

LeetCode133 克隆圖

 

克隆一張無向圖,圖中的每個節點包含一個 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
         / \
         \_/



 

 

//章節 - 佇列和棧    
//四、棧和深度優先搜尋
//2.克隆圖
/*
演算法思想:
    難點是如何處理每個節點的隨機指標,這道題目的難點在於如何處理每個節點的neighbors,由於在深度拷貝每一個節點後,還要將其所有neighbors放到一個vector中,而如何避免重複拷貝呢?這道題好就好在所有節點值不同,所以我們可以使用雜湊表來對應節點值和新生成的節點。對於圖的遍歷的兩大基本方法是深度優先搜尋DFS和廣度優先搜尋BFS,這裡我們使用深度優先搜尋DFS來解答此題,
*/ //演算法實現: /** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector<UndirectedGraphNode *> neighbors; * UndirectedGraphNode(int x) : label(x) {}; * }; */ class Solution { public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { unordered_map
<int, UndirectedGraphNode*> umap; return clone(node, umap); } UndirectedGraphNode *clone(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode*> &umap) { if (!node) return node; if (umap.count(node->label)) return umap[node->label]; UndirectedGraphNode *newNode = new UndirectedGraphNode(node->label); umap[node->label] = newNode; for (int i = 0; i < node->neighbors.size(); ++i) { (newNode->neighbors).push_back(clone(node->neighbors[i], umap)); } return newNode; } };