[LeetCode] Clone Graph
来源:互联网 发布:js obj 获取value 编辑:程序博客网 时间:2024/04/30 10:00
问题:
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 / \ \_/
思路本身没有什么tricky的地方。用bfs或者dfs来对原图进行traversal,同时复制原图即可。实践发现,dfs比bfs更简便。这里给出两个版本的代码。
代码:
bfs:
class Solution {public:UndirectedGraphNode *bfs(UndirectedGraphNode *node, map<int, UndirectedGraphNode *> &visited) {queue<UndirectedGraphNode *> bfsQueue;bfsQueue.push(node);while (!bfsQueue.empty()) {UndirectedGraphNode * curr = bfsQueue.front();UndirectedGraphNode * copyCurr = visited.find(curr->label)== visited.end() ? new UndirectedGraphNode(curr->label) :visited[curr->label];visited[curr->label] = copyCurr;bfsQueue.pop();for (int i = 0; i < curr->neighbors.size(); i ++) {if (visited.find(curr->neighbors[i]->label) == visited.end()) { // first time visitbfsQueue.push(curr->neighbors[i]);UndirectedGraphNode *temp = new UndirectedGraphNode(curr->neighbors[i]->label);visited[curr->neighbors[i]->label] = temp;copyCurr->neighbors.push_back(temp);}else { // not first time visitUndirectedGraphNode * temp = visited[curr->neighbors[i]->label];copyCurr->neighbors.push_back(temp);}}}return visited[node->label];}UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {if (!node) return node;map<int, UndirectedGraphNode *> visited;return bfs(node, visited);}};
dfs:
class Solution {public:UndirectedGraphNode *dfs(UndirectedGraphNode *node, map<int, UndirectedGraphNode *> &visited) {UndirectedGraphNode * copyNode = new UndirectedGraphNode (node->label);visited[node->label] = copyNode;for (int i = 0; i < node->neighbors.size(); i ++) {if (!visited[node->neighbors[i]->label])copyNode->neighbors.push_back(dfs(node->neighbors[i], visited));elsecopyNode->neighbors.push_back(visited[node->neighbors[i]->label]);}return copyNode;}UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) {if (!node) return node;map<int, UndirectedGraphNode *> visited;return dfs(node, visited);}};
0 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
- Excel中强大的数据导入功能
- 硬件工程师的软件之路—— ARM板卡的调试流程
- Linux 获取CPU温度
- js获取光标位置和设置文本框光标位置
- python抓取京东价格分析京东商品价格走势
- [LeetCode] Clone Graph
- PHP中设置时区方法小结
- PHP 时区设置
- php设置中国时区
- Swing 投影边框
- LeetCode(142)Linked List Cycle2
- PHP中数组,字符串和对象的在方法中的引用方式
- 移动互联网(APP)产品设计的经验分享
- [leet code] Single Number II