Leetcode Clone Graph
来源:互联网 发布:大学生防网络诈骗教育 编辑:程序博客网 时间:2024/05/17 08:11
Clone Graph
Total Accepted: 4360 Total Submissions: 21850My SubmissionsClone 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 / \ \_/
这里使用深度优先搜索。这样可以递归实现,如果是宽度优先,就要额外使用queue容器。
关键点:
1 这里的clone需要深度拷贝,就是要使用new操作了
2 防止回路无限循环,就要使用hash表,这里使用unordered_map记录访问过的节点。因为这里的label应该是唯一的才对,所以可以直接使用label作为关键字就可以。
看起来挺难的,因为图总给人困难的感觉,其实不难,3到4星级难度吧,很多都是基本操作组合起来。我一次性通过了。
struct UndirectedGraphNode {int label;vector<UndirectedGraphNode *> neighbors;UndirectedGraphNode(int x) : label(x) {};};class Solution {public:UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {unordered_map<int, UndirectedGraphNode *> track;return cloneGraph(node, track);}UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node, unordered_map<int, UndirectedGraphNode *> &track) {if (!node) return NULL;if (track.count(node->label)) return track[node->label];UndirectedGraphNode *new_node = new UndirectedGraphNode(node->label);new_node->neighbors.resize(node->neighbors.size());track[node->label] = new_node;for (int i = 0; i < node->neighbors.size(); i++){new_node->neighbors[i] = cloneGraph(node->neighbors[i], track);}return new_node;}};
//2014-2-18 updateUndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {unordered_map<int, UndirectedGraphNode *> ump_iu;return clone(node, ump_iu);}UndirectedGraphNode *clone(UndirectedGraphNode *n, unordered_map<int, UndirectedGraphNode *> &ump_iu){if (!n) return n;if (ump_iu.count(n->label)) return ump_iu[n->label];UndirectedGraphNode *rs = new UndirectedGraphNode(n->label);ump_iu[n->label] = rs;for (int i = 0; i < n->neighbors.size(); i++){(rs->neighbors).push_back(clone((n->neighbors[i]), ump_iu));}return rs;}
2 0
- LeetCode[Graph]: Clone Graph
- [LeetCode] CLone Graph
- LeetCode:Clone Graph
- [leetcode]Clone Graph
- Leetcode: Clone Graph
- [LeetCode] Clone Graph
- LeetCode题解:Clone Graph
- [LeetCode]Clone Graph
- leetcode Clone Graph
- leetcode-Clone Graph
- LeetCode | Clone Graph
- Leetcode: Clone Graph
- [LeetCode] Clone Graph
- LeetCode OJ:Clone Graph
- Leetcode Clone Graph
- [Leetcode] Clone Graph (Java)
- Clone Graph - LeetCode
- 【leetcode】Clone Graph
- html position
- zoj 3626 Treasure Hunt I(树形DP+分组背包)
- 恋爱,在感情
- Codeforces 383D. Antimatter
- HttpSendRequest's demo
- Leetcode Clone Graph
- 监听器统计在线人数
- oracle 11g 安装text 组件
- ∀x(P(x) → Q(x))和∀xP(x) → ∀xQ(x) 的区别
- 如何确定Java类是从哪个包加载的
- firefox的about:config说明及配置
- 如何用MFC实现这种带有checkbox的下拉列表框
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大经典原创系列集锦与总结
- javascript放在页面的位置问题