1
+ /*
2
+
3
+ Date: Jan 13, 2015
4
+ Problem: Clone Graph
5
+ Difficulty: Medium
6
+ Source: http://oj.leetcode.com/problems/clone-graph/
7
+ Notes:
8
+ Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors.
9
+
10
+ OJ's undirected graph serialization:
11
+ Nodes are labeled from 0 to N - 1, where N is the total nodes in the graph.
12
+ We use # as a separator for each node, and , as a separator for each neighbor of the node.
13
+ As an example, consider the serialized graph {1,2#2#2}.
14
+ The graph has a total of three nodes, and therefore contains three parts as separated by #.
15
+ Connect node 0 to both nodes 1 and 2.
16
+ Connect node 1 to node 2.
17
+ Connect node 2 to node 2 (itself), thus forming a self-cycle.
18
+ Visually, the graph looks like the following:
19
+
20
+ 1
21
+ / \
22
+ / \
23
+ 0 --- 2
24
+ / \
25
+ \_/
26
+
27
+ Solution: 1. DFS. 2. BFS.
28
+ */
29
+
30
+ /**
31
+ * Definition for undirected graph.
32
+ * class UndirectedGraphNode {
33
+ * int label;
34
+ * List<UndirectedGraphNode> neighbors;
35
+ * UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
36
+ * };
37
+ */
38
+ public class Solution {
39
+ public UndirectedGraphNode cloneGraph_1 (UndirectedGraphNode node ) {
40
+ HashMap <UndirectedGraphNode , UndirectedGraphNode > map = new HashMap <UndirectedGraphNode , UndirectedGraphNode >();
41
+ return cloneGraphRe (node , map );
42
+ }
43
+ public UndirectedGraphNode cloneGraphRe (UndirectedGraphNode node , HashMap <UndirectedGraphNode , UndirectedGraphNode > map ) {
44
+ if (node == null ) return null ;
45
+ if (map .containsKey (node ) == true ) {
46
+ return map .get (node );
47
+ }
48
+ UndirectedGraphNode newnode = new UndirectedGraphNode (node .label );
49
+ map .put (node , newnode );
50
+ for (UndirectedGraphNode cur : node .neighbors ) {
51
+ newnode .neighbors .add (cloneGraphRe (cur , map ));
52
+ }
53
+ return newnode ;
54
+ }
55
+ public UndirectedGraphNode cloneGraph (UndirectedGraphNode node ) {
56
+ HashMap <UndirectedGraphNode , UndirectedGraphNode > map = new HashMap <UndirectedGraphNode , UndirectedGraphNode >();
57
+ Queue <UndirectedGraphNode > queue = new LinkedList <UndirectedGraphNode >();
58
+ if (node == null ) return null ;
59
+ queue .offer (node );
60
+ map .put (node , new UndirectedGraphNode (node .label ));
61
+ while (queue .isEmpty () == false ) {
62
+ UndirectedGraphNode cur = queue .poll ();
63
+ for (UndirectedGraphNode neighbor : cur .neighbors ) {
64
+ if (map .containsKey (neighbor ) == false ) {
65
+ UndirectedGraphNode newnode = new UndirectedGraphNode (neighbor .label );
66
+ map .put (neighbor , newnode );
67
+ queue .offer (neighbor );
68
+ }
69
+ map .get (cur ).neighbors .add (map .get (neighbor ));
70
+ }
71
+ }
72
+ return map .get (node );
73
+ }
74
+ }
0 commit comments