您的位置:首页 > 编程语言 > Go语言

Clone Graph

2014-01-28 01:59 555 查看

Clone Graph

 Total Accepted: 4644 TotalSubmissions: 23154My SubmissionsClone an undirected graph. Each node in the graph contains a 
label
 anda list of its 
neighbors
.OJ's undirected graph serialization:Nodes are labeled uniquely.We use 
#
 as a separator for each node, and 
,
 asa separator for node label and each neighbor of the node.As an example, consider the serialized graph 
{0,1,2#1,2#2,2}
.The graph has a total of three nodes, and therefore contains three parts as separated by 
#
.First node is labeled as 
0
.Connect node 
0
 to both nodes 
1
 and 
2
.Second node is labeled as 
1
.Connect node 
1
 to node 
2
.Third node is labeled as 
2
.Connect node 
2
 to node 
2
 (itself),thus forming a self-cycle.Visually, the graph looks like the following:
1
/ \
/   \
0 --- 2
/ \
\_/
Discusssolution:Map<原始节点,克隆节点> 储存节点之间的联系,如果一个点在map中有,那么从map中取出,否则新建Node.BFS 遍历 Graph如果此原始节点未被访问过,新建或从map中取节点.遍历原始节点的neighbors, 将neighbors 添加进新节点中.// BFSpublic class CloneGraph {public static UndirectedGraphNode cloneGraph(UndirectedGraphNode node){if(node == null) return null;UndirectedGraphNode root = null;Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();Set<UndirectedGraphNode> set = new HashSet<>();Queue<UndirectedGraphNode> queue = new LinkedList<>();queue.add(node);while(!queue.isEmpty()){UndirectedGraphNode n = queue.poll();if(set.contains(n)) continue;set.add(n);UndirectedGraphNode cloned = null;if(map.containsKey(n)) cloned = map.get(n);else{cloned = new UndirectedGraphNode(n.label);map.put(n,cloned);}for(UndirectedGraphNode neighbor: n.neighbors){queue.add(neighbor);UndirectedGraphNode clonedNeighbor = null;if(map.containsKey(neighbor)) clonedNeighbor = map.get(neighbor);else{clonedNeighbor = new UndirectedGraphNode(neighbor.label);map.put(neighbor,clonedNeighbor);}cloned.neighbors.add(clonedNeighbor);}if(root == null) root = cloned;}return root;}}
// DFSpublic UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {if(node == null)return null;return clone(node,new HashMap<UndirectedGraphNode, UndirectedGraphNode>(), new HashSet<UndirectedGraphNode>());}private static UndirectedGraphNode clone(UndirectedGraphNode node, Map<UndirectedGraphNode, UndirectedGraphNode> map, Set        <UndirectedGraphNode> visitedSet){if(visitedSet.contains(node))return null;visitedSet.add(node);UndirectedGraphNode clonedNode;if(!map.containsKey(node)){clonedNode = new UndirectedGraphNode(node.label);map.put(node,clonedNode);}else{clonedNode = map.get(node);}for(UndirectedGraphNode n: node.neighbors){if(map.containsKey(n)){clonedNode.neighbors.add(map.970aget(n));}else{UndirectedGraphNode newNode = new UndirectedGraphNode(n.label);clonedNode.neighbors.add(newNode);map.put(n,newNode);}clone(n,map,visitedSet);}return clonedNode;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm leetcode