2015年10月12日星期一

Leetcode 133 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
         / \
         \_/
Solution 1: Recursive dfs. O(E)
 public class Solution {  
   public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {  
     if (node==null) return null;  
     Map<UndirectedGraphNode,UndirectedGraphNode> map=new HashMap<>();  
     dfs(map,node);  
     return map.get(node);  
   }  
   private void dfs(Map<UndirectedGraphNode,UndirectedGraphNode> map, UndirectedGraphNode v) {  
     UndirectedGraphNode x=new UndirectedGraphNode(v.label);  
     map.put(v,x);  
     for (UndirectedGraphNode w: v.neighbors) {  
       if (!map.containsKey(w)) dfs(map,w);  
       x.neighbors.add(map.get(w));  
     }  
   }  
 }  

Solution 2: BFS
 public class Solution {  
   public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {  
     if (node==null) return null;  
     Queue<UndirectedGraphNode> qu=new LinkedList<>();  
     Map<UndirectedGraphNode, UndirectedGraphNode> map=new HashMap<>();  
     UndirectedGraphNode x=new UndirectedGraphNode(node.label);  
     map.put(node,x);  
     qu.offer(node);  
     while (!qu.isEmpty()) {  
       UndirectedGraphNode v=qu.poll();  
       for (UndirectedGraphNode w: v.neighbors) {  
         if (!map.containsKey(w)) {  
           map.put(w, new UndirectedGraphNode(w.label));  
           qu.offer(w);  
         }  
         map.get(v).neighbors.add(map.get(w));  
       }  
     }  
     return map.get(node);  
   }  
 }  

没有评论:

发表评论