leetcode133 - Clone Graph - medium

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);
    }
}

 

posted @ 2018-10-10 02:39  jasminemzy  阅读(194)  评论(0编辑  收藏  举报