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 from 0 to N - 1, where N is the total nodes in the graph.
We use#
as a separator for each node, and
,
as a separator for each neighbor of the node.
As an example, consider the serialized graph {1,2#2#2}
.
The graph has a total of three nodes, and therefore contains three parts as separated by #
.
- Connect node 0 to both nodes
1
and2
. - Connect node 1 to node
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 {
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;
}
}