您的位置:首页 > 其它

Clone Graph

2018-01-05 14:39 253 查看
Clone an undirected graph. Each node in the graph contains a 
label
 and
a list of its 
neighbors
.
How we serialize an undirected graph:
Nodes are labeled uniquely.
We use 
#
 as a separator for each node,
and 
,
 as a 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
/ \
\_/

/**
* Definition for undirected graph.
* class UndirectedGraphNode {
*     int label;
*     ArrayList<UndirectedGraphNode> neighbors;
*     UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/

public class Solution {
/*
* @param node: A undirected graph node
* @return: A undirected graph node
*/
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
// write your code here
if (node == null) {
return null;
}
Map<UndirectedGraphNode, UndirectedGraphNode> map = new HashMap<>();
Queue<UndirectedGraphNode> queue = new LinkedList<>();
Set<UndirectedGraphNode> set = new HashSet<>();
queue.offer(node);
set.add(node);
while (!queue.isEmpty()) {
UndirectedGraphNode root = queue.poll();
map.put(root, new UndirectedGraphNode(root.label));
ArrayList<UndirectedGraphNode> neighbors = root.neighbors;
for (UndirectedGraphNode val : neighbors) {
if (!set.contains(val)) {
queue.offer(val);
set.add(val);
}
}
}
for (UndirectedGraphNode val : map.keySet()) {
for (UndirectedGraphNode temp : val.neighbors) {
map.get(val).neighbors.add(map.get(temp));
}
}
return map.get(node);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: