137-克隆图

克隆一张无向图,图中的每个节点包含一个 label 和一个列表 neighbors。
数据中如何表示一个无向图?http://www.lintcode.com/help/graph/
你的程序需要返回一个经过深度拷贝的新图。这个新图和原图具有同样的结构,并且对新图的任何改动不会对原图造成任何影响。

样例

比如,序列化图 {0,1,2#1,2#2,2} 共有三个节点, 因此包含两个个分隔符#。

  • 第一个节点label为0,存在边从节点0链接到节点1和节点2
  • 第二个节点label为1,存在边从节点1连接到节点2
  • 第三个节点label为2,存在边从节点2连接到节点2(本身),从而形成自环。

我们能看到如下的图:

标签

宽度优先搜索 脸书

思路

使用宽度优先搜索遍历原图的同时创建新图。使用 oldToNew 保存原图与新图同个节点的对应关系,用 isVisited 保存原图的某点是否被遍历。具体过程如下:

  • 对原图的第一个节点 node,新建一个节点 newNode 与 node 对应,即oldToNew[node] = newNode,并标记 node 已遍历,即 isVisited[node] = true,将 node 入队
  • 队列不为空时:
    队首元素 node 出队,遍历与 node 相连的节点,即 node->neighbors[i],
    若 node->neighbors[i] 未被遍历过,建立新节点与其对应,标记此结点以便利,将新节点连入新图
    若 node->neighbors[i] 已被遍历,将此结点对应的新节点连入新图

code

/*** Definition for undirected graph.* struct UndirectedGraphNode {*     int label;*     vector<UndirectedGraphNode *> neighbors;*     UndirectedGraphNode(int x) : label(x) {};* };*/
class Solution {
public:/*** @param node: A undirected graph node* @return: A undirected graph node*/UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {// write your code hereif(node == NULL) {return node;}queue<UndirectedGraphNode*> willVisit;map<UndirectedGraphNode*, bool> isVisited;map<UndirectedGraphNode*, UndirectedGraphNode*> oldToNew;UndirectedGraphNode * newNode = new UndirectedGraphNode(node->label);isVisited[node] = true;oldToNew[node] = newNode;willVisit.push(node);while(!willVisit.empty()) {node = willVisit.front();willVisit.pop();for(int i=0; i<node->neighbors.size(); i++) {if(isVisited[node->neighbors[i]] == false) {UndirectedGraphNode * temp = new UndirectedGraphNode(node->neighbors[i]->label);isVisited[node->neighbors[i]] = true;oldToNew[node->neighbors[i]] = temp;oldToNew[node]->neighbors.push_back(temp);willVisit.push(node->neighbors[i]);}else {oldToNew[node]->neighbors.push_back(oldToNew[node->neighbors[i]]);}}}return newNode;}
};

转载于:https://www.cnblogs.com/libaoquan/p/7222910.html

lintcode-137-克隆图相关推荐

  1. 图形结构:克隆图,图的遍历的应用,递归和迭代

    克隆一张无向图,图中的每个节点包含一个 label (标签)和一个 neighbors (邻接点)列表 . 克隆图时图的遍历的应用,树的遍历,图的遍历是最基本的操作,他们和数组的遍历是一样的,线性结构 ...

  2. 133. Clone Graph 克隆图

    给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node {public in ...

  3. leetcode--133. 克隆图

    给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值val(Int) 和其邻居的列表(list[Node]). 示例: 输入: {"$id":&qu ...

  4. 力扣133. 克隆图

    该题克隆图类似二叉树的遍历,是从根节点遍历叶节点. 复制思路:是dfs遍历原节点node,建立HashMap<Node,Node>原节点到克隆节点的映射,然后根据原节点,new出新节点,建 ...

  5. Leetcode 133.克隆图

    Time: 20190903 Type: Medium 题目描述 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[No ...

  6. 作文以记之 ~ 克隆图

    作文以记之 ~ 克隆图 0.前言 1.题目描述 2.解题思路 2.1 方法1 ~ 利用BFS 2.1.1 思路 2.1.2 程序代码 2.2 方法2 ~ 利用 DFS 2.2.1 思路 2.2.2 程 ...

  7. leetcode133. 克隆图(bfs)

    给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { public i ...

  8. [Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]

    [问题描述][中等] [解答思路] 其实就是深拷贝的一个实现,深拷贝就是对于所有的指针成员,不能仅仅是赋值,还有重新分配空间. 深拷贝反应在本题中就是,所有的结点需要重新new出来,而不是直接赋值. ...

  9. LeetCode 133. 克隆图(图的BFS/DFS)

    1. 题目 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). class Node {public:in ...

  10. leetcode —— 133. 克隆图

    给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { public i ...

最新文章

  1. L2:grep使用正则表达式
  2. 设计一个可扩展的用户登录系统
  3. jsp文件里java代码的作用_如何使用JSP 2避免JSP文件中的Java代码?
  4. leetcode python3 简单题167. Two Sum II - Input array is sorted
  5. Google 宣布 Kotlin-first 已四年,为什么 Java 开发者仍不买账?
  6. .condarc(conda 配置文件)、换国内源
  7. java基础学习及总结
  8. VS遍历windows文件夹的代码
  9. ADAMS2016启动证书错误解决
  10. 微信内置浏览器禁止调整字体大小的方法
  11. Bandizip下载安装教程
  12. mysql修改校对集_关于MySQL字符集和校对集问题
  13. 操作系统-进程状态变迁分析
  14. 记一次Maximo移动端app报错的原因
  15. excel表格怎么拆分成多个表格?
  16. ABAP中存储文件的方法
  17. html图片切换动画,js实现图片切换(动画版)
  18. Cesium量算-贴地形距离
  19. 丹琦女神出品|开放域问答综述
  20. Android 修改昵称

热门文章

  1. dedecms 常用标签
  2. C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。...
  3. Unity ScriptObject
  4. Ghost in IE6.web标准网页IE6中的幽灵。
  5. 邮件 自动打印 linux,Linux打印文件和发送邮件
  6. PostgreSQL11.7逻辑复制的搭建
  7. Java删除指定值结点[递归]图解
  8. 华为p40pro怎么用鸿蒙系统,华为p40pro鸿蒙系统正式版
  9. 销售系统软件mysql_Max(TM)销售管理系统
  10. linux od命令详解,详细介绍Linux od命令