lintcode-137-克隆图
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-克隆图相关推荐
- 图形结构:克隆图,图的遍历的应用,递归和迭代
克隆一张无向图,图中的每个节点包含一个 label (标签)和一个 neighbors (邻接点)列表 . 克隆图时图的遍历的应用,树的遍历,图的遍历是最基本的操作,他们和数组的遍历是一样的,线性结构 ...
- 133. Clone Graph 克隆图
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node {public in ...
- leetcode--133. 克隆图
给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值val(Int) 和其邻居的列表(list[Node]). 示例: 输入: {"$id":&qu ...
- 力扣133. 克隆图
该题克隆图类似二叉树的遍历,是从根节点遍历叶节点. 复制思路:是dfs遍历原节点node,建立HashMap<Node,Node>原节点到克隆节点的映射,然后根据原节点,new出新节点,建 ...
- Leetcode 133.克隆图
Time: 20190903 Type: Medium 题目描述 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[No ...
- 作文以记之 ~ 克隆图
作文以记之 ~ 克隆图 0.前言 1.题目描述 2.解题思路 2.1 方法1 ~ 利用BFS 2.1.1 思路 2.1.2 程序代码 2.2 方法2 ~ 利用 DFS 2.2.1 思路 2.2.2 程 ...
- leetcode133. 克隆图(bfs)
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { public i ...
- [Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]
[问题描述][中等] [解答思路] 其实就是深拷贝的一个实现,深拷贝就是对于所有的指针成员,不能仅仅是赋值,还有重新分配空间. 深拷贝反应在本题中就是,所有的结点需要重新new出来,而不是直接赋值. ...
- LeetCode 133. 克隆图(图的BFS/DFS)
1. 题目 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). class Node {public:in ...
- leetcode —— 133. 克隆图
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆). 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node]). class Node { public i ...
最新文章
- L2:grep使用正则表达式
- 设计一个可扩展的用户登录系统
- jsp文件里java代码的作用_如何使用JSP 2避免JSP文件中的Java代码?
- leetcode python3 简单题167. Two Sum II - Input array is sorted
- Google 宣布 Kotlin-first 已四年,为什么 Java 开发者仍不买账?
- .condarc(conda 配置文件)、换国内源
- java基础学习及总结
- VS遍历windows文件夹的代码
- ADAMS2016启动证书错误解决
- 微信内置浏览器禁止调整字体大小的方法
- Bandizip下载安装教程
- mysql修改校对集_关于MySQL字符集和校对集问题
- 操作系统-进程状态变迁分析
- 记一次Maximo移动端app报错的原因
- excel表格怎么拆分成多个表格?
- ABAP中存储文件的方法
- html图片切换动画,js实现图片切换(动画版)
- Cesium量算-贴地形距离
- 丹琦女神出品|开放域问答综述
- Android 修改昵称
热门文章
- dedecms 常用标签
- C++ 与 php 的交互 之----- C++ 异步获取 网页文字内容,异步获取 php 的 echo 值。...
- Unity ScriptObject
- Ghost in IE6.web标准网页IE6中的幽灵。
- 邮件 自动打印 linux,Linux打印文件和发送邮件
- PostgreSQL11.7逻辑复制的搭建
- Java删除指定值结点[递归]图解
- 华为p40pro怎么用鸿蒙系统,华为p40pro鸿蒙系统正式版
- 销售系统软件mysql_Max(TM)销售管理系统
- linux od命令详解,详细介绍Linux od命令