descrption
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.解题思路
这道题更像是数据结构的题目,复制一个无向图相当于遍历一遍这个无向图。我们将没有访问的node放在一个队列里,用map存储克隆的新的node。在这里利用广度优先的方式遍历图,对于在待访问队列中的node,克隆这个node后放在map中,接着访问该node的邻居,如果邻居的克隆已经在map中了,只需要更改克隆node的邻居,否则就将该邻居放在待访问的队列中,并且克隆它并放在map中,之后更改克隆node的邻居。- 代码如下
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node == NULL){
return NULL;
}
UndirectedGraphNode* clonenode = new UndirectedGraphNode(node->label);
//nodes not visted
deque<UndirectedGraphNode*> queue;
queue.push_back(node);
//clone nodes
unordered_map<int, UndirectedGraphNode*> record;
record[node->label] = clonenode;
while(!queue.empty()){
UndirectedGraphNode *origin = queue.front();
queue.pop_front();
UndirectedGraphNode *clone = record[origin->label];
for(int i = 0; i < origin->neighbors.size(); i++){
UndirectedGraphNode *neighbor = origin->neighbors[i];
if(record[neighbor->label] != NULL){
clone->neighbors.push_back(record[neighbor->label]);
continue;
}
queue.push_back(neighbor);
UndirectedGraphNode *newnode = new UndirectedGraphNode(neighbor->label);
record[neighbor->label] = newnode;
clone->neighbors.push_back }
}
return clonenode;
}
};
LeetCode题目原址
如有错误请指正,谢谢!