您的位置:首页 > 其它

【leetcode】Clone Graph

2014-02-25 01:07 218 查看


题目:

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 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
/ \
\_/


思路:

首先做一次BFS遍历,将所有结点创建出来。并且要保存在一个可以在短时间读取的结构中。map是个不错的结构并且每个结点label唯一,因此我们可以用label来作为索引。

第二次遍历的时候可以快速地找出结点并构造图的关系。

代码:

[java] view
plaincopy

/**

* 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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: