LeetCode(133) Clone Graph
2016-10-13 15:12
441 查看
题目:复制一张无向图.
Clone an undirected graph. Each node in the graph contains a
OJ's undirected graph serialization:
Nodes are labeled uniquely.
We use
a separator for node label and each neighbor of the node.
As an example, consider the serialized graph
The graph has a total of three nodes, and therefore contains three parts as separated by
First node is labeled as
both nodes
Second node is labeled as
node
Third node is labeled as
node
Visually, the graph looks like the following:
解法:
遍历一遍原图即可,可以用bfs或dfs。容易错的是图有可能有多重边。另外邻接表中的元素是指针,所以如果访问某个节点n,它的邻居中有一个已经生成过的节点,要找到原来的这个节点,再把指向原来节点的指针放入n的邻接表中。否则,生成一个新节点,再把指向新节点的指针放入n的邻接表中。
代码:
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node==NULL) return NULL;
map<int,UndirectedGraphNode*> hasCreated;//已生成的节点集合
UndirectedGraphNode *graph=new UndirectedGraphNode(node->label);
hasCreated[node->label]=graph;
dfs(graph,node,hasCreated);
return graph;
}
void dfs(UndirectedGraphNode *newGraph,UndirectedGraphNode *oldGraph,map<int,UndirectedGraphNode*>& hasCreated)
{
for(int i=0;i<(oldGraph->neighbors).size();i++)
{
UndirectedGraphNode *neighbor=(oldGraph->neighbors)[i];
map<int,UndirectedGraphNode*>::iterator it=hasCreated.find(neighbor->label);
if(it==hasCreated.end())
{
UndirectedGraphNode *node=new UndirectedGraphNode(neighbor->label);
(newGraph->neighbors).push_back(node);
hasCreated[neighbor->label]=node;
dfs(node,neighbor,hasCreated);
}
else
{
(newGraph->neighbors).push_back(it->second);
}
}
}
};
Clone an undirected graph. Each node in the graph contains a
labeland 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
0to
both nodes
1and
2.
Second node is labeled as
1. Connect node
1to
node
2.
Third node is labeled as
2. Connect node
2to
node
2(itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1 / \ / \ 0 --- 2 / \ \_/
解法:
遍历一遍原图即可,可以用bfs或dfs。容易错的是图有可能有多重边。另外邻接表中的元素是指针,所以如果访问某个节点n,它的邻居中有一个已经生成过的节点,要找到原来的这个节点,再把指向原来节点的指针放入n的邻接表中。否则,生成一个新节点,再把指向新节点的指针放入n的邻接表中。
代码:
class Solution {
public:
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {
if(node==NULL) return NULL;
map<int,UndirectedGraphNode*> hasCreated;//已生成的节点集合
UndirectedGraphNode *graph=new UndirectedGraphNode(node->label);
hasCreated[node->label]=graph;
dfs(graph,node,hasCreated);
return graph;
}
void dfs(UndirectedGraphNode *newGraph,UndirectedGraphNode *oldGraph,map<int,UndirectedGraphNode*>& hasCreated)
{
for(int i=0;i<(oldGraph->neighbors).size();i++)
{
UndirectedGraphNode *neighbor=(oldGraph->neighbors)[i];
map<int,UndirectedGraphNode*>::iterator it=hasCreated.find(neighbor->label);
if(it==hasCreated.end())
{
UndirectedGraphNode *node=new UndirectedGraphNode(neighbor->label);
(newGraph->neighbors).push_back(node);
hasCreated[neighbor->label]=node;
dfs(node,neighbor,hasCreated);
}
else
{
(newGraph->neighbors).push_back(it->second);
}
}
}
};
相关文章推荐
- LeetCode: Clone Graph [133]
- Leetcode 133 Clone Graph
- Java for LeetCode 133 Clone Graph
- LeetCode133 Clone Graph
- leetcode || 133、Clone Graph
- [leetcode] 133 Clone Graph
- [leetcode] 133 clone graph bfs
- LeetCode(133)Clone a Graph
- leetcode_c++:图:Clone Graph(133)
- Clone Graph Leetcode 133
- Leetcode 133 Clone Graph
- 133 Clone Graph [Leetcode]
- leetcode做题总结,题目Clone Graph 133
- leetcode——133——Clone Graph
- [leetcode 133]Clone Graph
- [Leetcode 133, Medium] Clone Graph
- leetcode[133]Clone Graph
- [LeetCode#133]Clone Graph
- LeetCode 133 Clone Graph
- leetcode 133 clone-graph 克隆图(图的遍历算法)