博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode133 - Clone Graph - medium
阅读量:4694 次
发布时间:2019-06-09

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

Given the head of a graph, return a deep copy (clone) of the graph. Each node in the graph contains a label (int) and a list (List[UndirectedGraphNode]) of its neighbors. There is an edge between the given node and each of the nodes in its neighbors.
OJ's undirected graph serialization (so you can understand error output):
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
         / \
         \_/
 
Note: The information about the tree serialization is only meant so that you can understand error output if you get a wrong answer. You don't need to understand the serialization to solve the problem.
 
 
BFS+Map.
BFS直接对老nodesBFS,q里都加老nodes。Map里存着label到新node的映射。
BFS到某个老node的时候,遍历邻居的时候只要两件事情:
1.如果邻居node还没有,新建node。
2.在由新nodes组建的图中连上边。因为你知道当前BFS是对哪个点以及当前访问的邻居是谁,所以知道是哪条边。
最后返回mapping.get(head.label)即可。
 
实现:
/** * Definition for undirected graph. * class UndirectedGraphNode { *     int label; *     List
neighbors; * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList
(); } * }; */public class Solution { public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { // map: Integer-Node: label - Created Node if (node == null) { return null; } Map
map = new HashMap<>(); Queue
q = new LinkedList<>(); q.offer(node); map.put(node.label, new UndirectedGraphNode(node.label)); while (!q.isEmpty()) { UndirectedGraphNode crt = q.poll(); for (UndirectedGraphNode neighbor : crt.neighbors) { // 1.generate node if needed. if (!map.containsKey(neighbor.label)) { UndirectedGraphNode newNode = new UndirectedGraphNode(neighbor.label); map.put(neighbor.label, newNode); q.offer(neighbor); } // 2.link the edge for the new graph. map.get(crt.label).neighbors.add(map.get(neighbor.label)); } } return map.get(node.label); }}

 

转载于:https://www.cnblogs.com/jasminemzy/p/9764167.html

你可能感兴趣的文章
假期周进度报告3
查看>>
现在k8s新版里,如何在每个node上运行一个带privileged的daemonset
查看>>
试玩GitHub
查看>>
N多人遇到的同样问题--MAGENTO更改网址
查看>>
关于mongodb的一些笔记
查看>>
动态添加方法的代码分析
查看>>
REDIS 安装
查看>>
thinkPHP5.0使用模型新增数据
查看>>
第二次ScrumMeeting
查看>>
微信二次分享功能开发笔记
查看>>
SQL 优化
查看>>
OPTIONS 跨域请求
查看>>
客户端第一天学习的相关知识
查看>>
python工具pycharm使用-断点调试
查看>>
Python生成pyc文件
查看>>
Linux防火墙的关闭和开启
查看>>
LeetCode - Same Tree
查看>>
Python dict get items pop update
查看>>
[置顶] 程序员必知(二):位图(bitmap)
查看>>
130242014036-(2)-体验敏捷开发
查看>>