From 34f62eafb9cee64cbe0b33985bebb9fbd796032b Mon Sep 17 00:00:00 2001 From: applewjg Date: Wed, 14 Jan 2015 23:54:50 +0800 Subject: [PATCH] Clone Graph Change-Id: If70cd55492a20f1da193454f580ddfdb3d41126a --- CloneGraph.java | 74 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 CloneGraph.java diff --git a/CloneGraph.java b/CloneGraph.java new file mode 100644 index 0000000..5bea7e6 --- /dev/null +++ b/CloneGraph.java @@ -0,0 +1,74 @@ +/* + 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); + } +} \ No newline at end of file