leetcode每日一道(16)複製一個無向圖,每個節點都包含一個標籤和它的鄰居列表

題目描述

本題要求複製一個無向圖,圖中每個節點都包含一個標籤和它的鄰居列表
我們無向圖用以下的方法序列化:
節點的標籤是互不相同的,
我們使用“#”作爲節點之間的分隔符,使用“,”作爲節點標籤和節點的節點鄰居的分隔符。
例如:現在有一個序列化的無向圖{0,1,2#1,2#2,2}.
這個無向圖一共有3個節點,因此序列被#分隔成三部分
第一個節點的標籤是0,節點0和節點1,節點2之間有邊
第二個節點的標籤是1,節點1和節點2之間有邊
第三個節點的標籤是2,節點2和節點2(它自己)之間有邊,形成了自環

我們看到了這個題之後,有什麼想法呢,這個無向圖,和鏈表,和二叉樹有什麼區別呢,其實沒有本質的區別,無非是另外一種結構罷了。那麼我們如何複製呢,本題的解法就涉及到兩個知識點

  1. 無向圖如何能遍歷完全?深度優先遍歷DFS,把圖的節點先複製下來。
  2. 用map保存舊節點和新節點的映射關係。
    一些細節呢,比如DFS通過遞歸實現,map用的是unordered_map<>實現,unordered_map中的元素,first是key,second是value。

下面就是代碼,整體來說沒有多少難度

/**
 * Definition for undirected graph.
 * struct UndirectedGraphNode {
 *     int label;
 *     vector<UndirectedGraphNode *> neighbors;
 *     UndirectedGraphNode(int x) : label(x) {};
 * };
 */
class Solution {
public:
    unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> mp;
    void dfs(UndirectedGraphNode* node){
        if(node==nullptr) return;
        if(mp.count(node)) return;
        auto cpyNode = new UndirectedGraphNode(node->label);
        mp[node] = cpyNode;
        for (auto subnode:node->neighbors){
            dfs(subnode);
        }
    }
    UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
        auto oldNode = node;
        dfs(node);
        for (auto item:mp){
            auto first = item.first;
            for(int i=0;i < first->neighbors.size();i++){
                item.second->neighbors.push_back(mp[first->neighbors[i]]);
            }
        }
        return mp[oldNode];
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章