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<UndirectedGraphNode> neighbors; * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); } * }; */ public class Solution { public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { // map: Integer-Node: label - Created Node if (node == null) { return null; } Map<Integer, UndirectedGraphNode> map = new HashMap<>(); Queue<UndirectedGraphNode> 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); } }