[LeetCode] Clone Graph 无向图的复制

简介:

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.

OJ's undirected graph serialization:

Nodes are labeled uniquely.

We use  # as a separator for each node, and  , as a separator for node label and each neighbor of the node.

As an example, consider the serialized graph {0,1,2#1,2#2,2}.

The graph has a total of three nodes, and therefore contains three parts as separated by #.

  1. First node is labeled as 0. Connect node 0 to both nodes 1 and 2.
  2. Second node is labeled as 1. Connect node 1 to node 2.
  3. Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.

Visually, the graph looks like the following:

       1
      / \
     /   \
    0 --- 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;
    } 
};

本文转自博客园Grandyang的博客,原文链接:无向图的复制[LeetCode] Clone Graph ,如需转载请自行联系原博主。

相关文章
(Java)链表OJ题---LeetCode 138 复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
(Java)链表OJ题---LeetCode 138 复制带随机指针的链表
|
程序员
【Leetcode】拿捏链表(五)——138. 复制带随机指针的链表
【Leetcode】拿捏链表(五)——138. 复制带随机指针的链表
80 0
【Leetcode】拿捏链表(五)——138. 复制带随机指针的链表
|
存储 算法
LeetCode 92反转链表Ⅱ&93复制ip地址&94二叉树的中序遍历
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
86 0
LeetCode 92反转链表Ⅱ&93复制ip地址&94二叉树的中序遍历
|
Java Python
LeetCode 第 138 题:复制带随机指针的链表(Python 代码)
给定一个长度为 n 的链表,每个节点比普通的节点多了一个额外的随机指针 ramdom,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。所谓的深拷贝,就是完全生成一个新的对象,内存地址都是不同的,这样改变拷贝之前变量,就不会影响到拷贝的变量。
110 0
|
算法 Java 虚拟化
LeetCode(算法)- 138. 复制带随机指针的链表
LeetCode(算法)- 138. 复制带随机指针的链表
83 0
LeetCode(算法)- 138. 复制带随机指针的链表
|
Java 虚拟化 C++
LeetCode(剑指 Offer)- 35. 复杂链表的复制
LeetCode(剑指 Offer)- 35. 复杂链表的复制
94 0
LeetCode(剑指 Offer)- 35. 复杂链表的复制
|
算法 前端开发 程序员
「LeetCode」剑指Offer-35复杂链表的复制⚡️
「LeetCode」剑指Offer-35复杂链表的复制⚡️
155 0
「LeetCode」剑指Offer-35复杂链表的复制⚡️
|
算法 索引
​LeetCode刷题实战138:复制带随机指针的链表
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
97 0
​LeetCode刷题实战138:复制带随机指针的链表