博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Clone Graph
阅读量:5906 次
发布时间:2019-06-19

本文共 3155 字,大约阅读时间需要 10 分钟。

 

This problem is an application of graph traversal, which has two systematic methods: Bread-First Search (BFS) and Depth-First Search (DFS). In the following, I am going to assume that you are familiar with them and just focus on what I think is the most tricky part of this problem, that is, what else is needed beyond graph traversal to clone a graph?

In order to clone a graph, you need to have a copy of each node in the original graph. Well, you may not have too many ideas about it. Let's do an example.

Suppose we are given a graph {0, 1 # 1, 0}. We know that the graph has two nodes 0 and1 and they are connected to each other.

We now start from 0. We make a copy of 0. Then we check 0's neighbors and we see 1. We make a copy of 1 and we add the copy to the neighbors of the copy of 0. Now the cloned graph is {0 (copy), 1 (copy)}. Then we visit 1. We make a copy of 1... well, wait, why do we make another copy of it? We already have one! Note that if you make a new copy of the node, these copies are not the same and the graph structure will be wrong! This is just what I mean by "the most tricky part of this problem". In fact, we need to maintain a mapping from each node to its copy. If the node has an existed copy, we simply use it. So in the above example, the remaining process is that we visit the copy of 1 and add the copy of 0 to its neighbors and the cloned graph is eventually {0 (copy), 1 (copy) # 1 (copy), 0 (copy)}.

Note that the above process uses BFS. Of course, you can use DFS. The key is the node-copy mapping, anyway.


BFS 

1 class Solution { 2 public: 3     UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { 4         if (!node) return NULL; 5         UndirectedGraphNode* copy = new UndirectedGraphNode(node -> label); 6         mp[node] = copy; 7         queue
toVisit; 8 toVisit.push(node); 9 while (!toVisit.empty()) {10 UndirectedGraphNode* cur = toVisit.front();11 toVisit.pop();12 for (int i = 0; i < (int)cur -> neighbors.size(); i++) {13 UndirectedGraphNode* neigh = cur -> neighbors[i];14 if (mp.find(neigh) == mp.end()) {15 UndirectedGraphNode* neigh_copy = new UndirectedGraphNode(neigh -> label);16 mp[neigh] = neigh_copy;17 toVisit.push(neigh);18 }19 mp[cur] -> neighbors.push_back(mp[neigh]);20 }21 }22 return copy;23 }24 private:25 unordered_map
mp;26 };

DFS

This very succinct DFS code is taken from .

1 class Solution { 2 public: 3     UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { 4         if (!node) return NULL; 5         if (mp.find(node) == mp.end()) { 6             mp[node] = new UndirectedGraphNode(node -> label); 7             for (UndirectedGraphNode* neigh : node -> neighbors) 8                 mp[node] -> neighbors.push_back(cloneGraph(neigh)); 9         }10         return mp[node];11     }12 private:13     unordered_map
mp;14 };

If you want to learn more about this problem, you may refer to .

 

转载地址:http://vxjpx.baihongyu.com/

你可能感兴趣的文章
Java11的新特性
查看>>
ElasticSearch5.6.5集群部署及调优、Head和Bigdesk插件安装
查看>>
【干货】CCNP这些基本配置命令,你都掌握了吗?
查看>>
Web Services 接口对接最简单快捷的方法(.net)
查看>>
JAVA中转换问题
查看>>
Nginx安装及配置详细教程
查看>>
【JEECG技术文档】MiniDao支持ID自增主键策略
查看>>
H盘和I盘都损坏了提示磁盘未被格式化怎么办
查看>>
java设计模式之中介者模式
查看>>
PHP多种序列化/反序列化的方法
查看>>
解决全站字符编码问题--动态代理和静态代理
查看>>
arailsdemo x
查看>>
Lucene的高级使用之高亮显示
查看>>
一些关于企业文化的要点(翻译)
查看>>
Wireshark 【OSI二层】抓包过滤规则和显示过滤规则实例
查看>>
Rails 命令及用法
查看>>
CentOS 6.5 部署Kafka集群
查看>>
基础的 Linux 命令使用方法实例
查看>>
linux 是否支持中文
查看>>
linux菜鸟基础学习 (三) 文件权限
查看>>