package com.interview.books.leetcodeoj; import java.util.*; /** * Created_By: stefanie * Date: 14-12-27 * Time: 下午12:12 */ public class LOJ133_CloneGraph { class UndirectedGraphNode{ int label; List<UndirectedGraphNode> neighbors; public UndirectedGraphNode(int label){ this.label = label; neighbors = new ArrayList(); } } //use BFS to clone the graph, keep HashMap<oldNode, cloneNode> pair //when clone a new node, put in nodeMap and also offer in queue //make sure the node in stack have a copy in nodeMap, use nodeMap as visited public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { if(node == null) return null; Map<UndirectedGraphNode, UndirectedGraphNode> nodeMap = new HashMap(); Queue<UndirectedGraphNode> queue = new LinkedList(); queue.offer(node); nodeMap.put(node, new UndirectedGraphNode(node.label)); while(!queue.isEmpty()){ UndirectedGraphNode current = queue.poll(); UndirectedGraphNode clone = nodeMap.get(current); for(UndirectedGraphNode neighbor : current.neighbors){ if(nodeMap.containsKey(neighbor)){ clone.neighbors.add(nodeMap.get(neighbor)); } else { UndirectedGraphNode cloneNeighbor = new UndirectedGraphNode(neighbor.label); nodeMap.put(neighbor, cloneNeighbor); queue.offer(neighbor); clone.neighbors.add(cloneNeighbor); } } } return nodeMap.get(node); } }