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 node0
to both nodes1
and2
. - Second node is labeled as
1
. Connect node1
to node2
. - Third node is labeled as
2
. Connect node2
to node2
(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1 / \ / \ 0 --- 2 / \ \_/本题的目的是叫我们复制一个图,难度并不是很大,但是由于本题无法测试,只能直接提交,还是很容易出现错误的。
考虑到图的算法我们可以使用DFS或者BFS,我们先用熟悉并且较为简单的DFS来实现,代码如下:
代码中判断顶点是否已在图中存在的函数耗费了大量的时间,我们可以通过使用哈希表来缩短查找时间,下面是使用哈希表 修改后的代码:
class Solution {
public:
vector<UndirectedGraphNode *> no;
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node == NULL) return NULL;
if(find(node->label) == NULL)
{
UndirectedGraphNode *res = new UndirectedGraphNode(node->label);
no.push_back(res);
for(int i = 0; i < node->neighbors.size(); i++)
{
res->neighbors.push_back(cloneGraph(node->neighbors[i]));
}
return res;
}
return find(node->label);
}
inline UndirectedGraphNode *find(int t)
{
for(int i = 0; i < no.size(); i++)
if(no[i]->label == t) return no[i];
return NULL;
}
};
代码中判断顶点是否已在图中存在的函数耗费了大量的时间,我们可以通过使用哈希表来缩短查找时间,下面是使用哈希表 修改后的代码:
class Solution {
public:
unordered_map<UndirectedGraphNode*, UndirectedGraphNode*> no;
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node == NULL) return NULL;
if(no.find(node) == no.end())
{
no[node] = new UndirectedGraphNode(node->label);
for(int i = 0; i < node->neighbors.size(); i++)
{
no[node]->neighbors.push_back(cloneGraph(node->neighbors[i]));
}
}
return no[node];
}
};