#
@(leetcode)[BFS, 图论]
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
/ \
\_/
代码
/**
* Definition for undirected graph.
* struct UndirectedGraphNode {
* int label;
* vector<UndirectedGraphNode *> neighbors;
* UndirectedGraphNode(int x) : label(x) {};
* };
*/
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(NULL == node) {
return node;
}
queue<UndirectedGraphNode*> que;
unordered_map<int, UndirectedGraphNode*> hash_map;
que.push(node);
//第一次BFS,将所有节点存入到map中
while(!que.empty()) {
UndirectedGraphNode* tmp = que.front();
que.pop();
if(hash_map.count(tmp->label) == 0) {
UndirectedGraphNode* new_node = new UndirectedGraphNode(tmp->label);
hash_map[new_node->label] = new_node;
for(int i = 0; i < tmp->neighbors.size(); ++i) {
que.push(tmp->neighbors[i]);
}
}
}
//第二次BFS,复制原图的所有临接节点
que.push(node);
while(!que.empty()) {
UndirectedGraphNode* tmp = que.front();
que.pop();
UndirectedGraphNode* exisit_node = hash_map[tmp->label];
if(exisit_node->neighbors.empty() && !tmp->neighbors.empty()) {
for(int i = 0; i < tmp->neighbors.size(); ++i) {
exisit_node->neighbors.push_back(hash_map[tmp->neighbors[i]->label]);
que.push(tmp->neighbors[i]);
}
}
}
return hash_map[node->label];
}
};