Clone Graph

问题描述

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.


OJ's undirected graph serialization:

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
         / \
         \_/

解决思路

因为节点的label值唯一,可以使用一个HashMap来记录<node.label, copy node>。

使用BFS来遍历所有的原始图上的节点,通过map查找到复制节点,然后添加neighbors。

 

程序

public class Solution {
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        if (node == null) {
            return null;
        }
        
        HashMap<Integer, UndirectedGraphNode> map = new HashMap<>(); // label unique
        Queue<UndirectedGraphNode> q = new LinkedList<>();
        q.offer(node);
        
        while (!q.isEmpty()) {
            // bfs
            int size = q.size();
            for (int i = 0; i < size; i++) {
                UndirectedGraphNode top = q.poll();
                if (!map.containsKey(top.label)) {
                    map.put(top.label, new UndirectedGraphNode(top.label));
                }
                UndirectedGraphNode copy = map.get(top.label);
                List<UndirectedGraphNode> neighbors = top.neighbors;
                
                if (neighbors != null && neighbors.size() > 0) {
                    for (UndirectedGraphNode n : neighbors) {
                        if (!map.containsKey(n.label)) {
                            map.put(n.label, new UndirectedGraphNode(n.label));
                            q.offer(n);
                        }
                        copy.neighbors.add(map.get(n.label));
                    }
                }
            }
        }
        
        return map.get(node.label);
    }
}

 

posted @ 2015-08-13 19:16  Chapter  阅读(151)  评论(0编辑  收藏  举报