【leetcode】Clone Graph
2014-02-25 01:07
218 查看
题目:
Clone an undirected graph. Each node in the graph contains a labeland
a list of its
neighbors.
OJ's undirected graph serialization:
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
0to both nodes
1and
2.
Second node is labeled as
1. Connect
node
1to node
2.
Third node is labeled as
2. Connect
node
2to node
2(itself),
thus forming a self-cycle.
Visually, the graph looks like the following:
1 / \ / \ 0 --- 2 / \ \_/
思路:
首先做一次BFS遍历,将所有结点创建出来。并且要保存在一个可以在短时间读取的结构中。map是个不错的结构并且每个结点label唯一,因此我们可以用label来作为索引。第二次遍历的时候可以快速地找出结点并构造图的关系。
代码:
[java] viewplaincopy
/**
* Definition for undirected graph.
* class UndirectedGraphNode {
* int label;
* ArrayList<UndirectedGraphNode> neighbors;
* UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
* };
*/
public class Solution {
Map<Integer, UndirectedGraphNode> nodeMap = new HashMap<Integer, UndirectedGraphNode>();
public UndirectedGraphNode cloneGraph(UndirectedGraphNode node) {
// Note: The Solution object is instantiated only once and is reused by each test case.
if (node == null) {
return null;
}
LinkedList<UndirectedGraphNode> stack = new LinkedList<UndirectedGraphNode>();
//Map<Integer, UndirectedGraphNode> nodeMap = new HashMap<Integer, UndirectedGraphNode>();
nodeMap.clear();
Set<Integer> isFound = new HashSet<Integer>();
stack.addLast(node);
UndirectedGraphNode head = null;
while (!stack.isEmpty()) {
UndirectedGraphNode first = stack.getFirst();
stack.removeFirst();
int label = first.label;
UndirectedGraphNode n = nodeMap.get(label);
if (n == null) {
n = new UndirectedGraphNode(label);
nodeMap.put(label, n);
}
if (head == null) {
head = n;
}
if (!isFound.contains(label)) {
isFound.add(label);
ArrayList<UndirectedGraphNode> neighbors = first.neighbors;
for (UndirectedGraphNode nb : neighbors) {
UndirectedGraphNode nn = nodeMap.get(nb.label);
if (nn == null) {
nn = new UndirectedGraphNode(nb.label);
nodeMap.put(nb.label, nn);
stack.addLast(nb);
}
n.neighbors.add(nn); }
}
}
return head;
}
}
相关文章推荐
- LeetCode:Clone Graph
- LeetCode OJ Clone Graph
- leetcode Clone Graph
- 【LeetCode】Clone Graph 解题报告
- Leetcode: Clone Graph
- Leetcode: Clone Graph
- Leetcode 133 Clone Graph
- 【leetcode】Clone Graph(python)
- leetcode -- Clone Graph
- [LeetCode][Java] Clone Graph
- LeetCode: Clone Graph
- Leetcode NO.133 Clone Graph
- LeetCode 19 Clone Graph
- LeetCode: Clone Graph
- [leetcode-133]Clone Graph(java)
- leetcode 133: Clone Graph
- [leetcode]Clone Graph
- LeetCode Clone Graph
- leetcode_c++:图:Clone Graph(133)
- LeetCode 133 Clone Graph