2014年5月6日星期二

Loop Solution - Clone Graph

The point of this problem is to be calm… So we need a way to record already defined cloned nodes, in both node copy and neighbor(s) copy. Any a way to see if the node in original graph has been processed… which Set is enough… A queue is used to maintain the current work table… … loop solution else… be aware to return the start node when process is empty (check this before add processed not in the set).

/**
 * Definition for undirected graph.
 * class UndirectedGraphNode {
 *     int label;
 *     ArrayList<UndirectedGraphNode> neighbors;
 *     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
 * };
 */
public class Solution {
   
    public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
        if(node == null){
            return null;
        }
        Map<Integer, UndirectedGraphNode> recordNodes = new HashMap<Integer, UndirectedGraphNode>();
        Set<UndirectedGraphNode> processed = new HashSet<UndirectedGraphNode>();
        Queue<UndirectedGraphNode> process = new LinkedList<UndirectedGraphNode>();
        process.offer(node);
        UndirectedGraphNode resNode = null;
        while(!process.isEmpty()){
            UndirectedGraphNode newNode;
            if(recordNodes.containsKey(process.peek().label)){
                newNode = recordNodes.get(process.peek().label);
                newNode.neighbors.clear(); // incase itself is in the neighbor's list.
            }else{
                newNode = new UndirectedGraphNode(node.label);
                recordNodes.put(process.peek().label, newNode);
            }
            List<UndirectedGraphNode> newNeighbors = new ArrayList<UndirectedGraphNode>();
            for(int i = 0; i < process.peek().neighbors.size(); i++){
                UndirectedGraphNode newNeighborNode;
                if(recordNodes.containsKey(process.peek().neighbors.get(i).label)){
                    newNeighborNode = recordNodes.get(process.peek().neighbors.get(i).label);
                }else{
                    newNeighborNode = new UndirectedGraphNode(process.peek().neighbors.get(i).label);
                    recordNodes.put(process.peek().neighbors.get(i).label, newNeighborNode);
                }
                if(!processed.contains(process.peek().neighbors.get(i))){
                    process.offer(process.peek().neighbors.get(i));
                }
                newNeighbors.add(newNeighborNode);
            }
            newNode.neighbors.addAll(newNeighbors);
            if(processed.size() == 0){
                resNode = newNode;
            }
            processed.add(process.poll());
           
        }
       
        return resNode;
    }
}

没有评论: