/* Author: Andy, nkuwjg@gmail.com Date: Jan 13, 2015 Problem: Clone Graph Difficulty: Medium Source: http://oj.leetcode.com/problems/clone-graph/ Notes: 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 from 0 to N - 1, where N is the total nodes in the graph. We use # as a separator for each node, and , as a separator for each neighbor of the node. As an example, consider the serialized graph {1,2#2#2}. The graph has a total of three nodes, and therefore contains three parts as separated by #. Connect node 0 to both nodes 1 and 2. Connect node 1 to node 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. DFS. 2. BFS. */ /** * Definition for undirected graph. * class UndirectedGraphNode { * int label; * List neighbors; * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList(); } * }; */ public class Solution { public UndirectedGraphNode cloneGraph_1(UndirectedGraphNode node) { HashMap map = new HashMap(); return cloneGraphRe(node, map); } public UndirectedGraphNode cloneGraphRe(UndirectedGraphNode node, HashMap map) { if (node == null) return null; if (map.containsKey(node) == true) { return map.get(node); } UndirectedGraphNode newnode = new UndirectedGraphNode(node.label); map.put(node, newnode); for (UndirectedGraphNode cur : node.neighbors) { newnode.neighbors.add(cloneGraphRe(cur, map)); } return newnode; } public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) { HashMap map = new HashMap(); Queue queue = new LinkedList(); if (node == null) return null; queue.offer(node); map.put(node, new UndirectedGraphNode(node.label)); while (queue.isEmpty() == false) { UndirectedGraphNode cur = queue.poll(); for (UndirectedGraphNode neighbor : cur.neighbors) { if (map.containsKey(neighbor) == false) { UndirectedGraphNode newnode = new UndirectedGraphNode(neighbor.label); map.put(neighbor, newnode); queue.offer(neighbor); } map.get(cur).neighbors.add(map.get(neighbor)); } } return map.get(node); } }