LeetCode 133. Clone Graph
deep copy graph,图的问题。要copy首先要遍历,遍历图可以用dfs也可以bfs。
本题的关键在于,由于节点和节点之间连通,当前遍历的节点很可能之前就已经clone过了,此时就不需要再一次clone了,否则会出现问题。
因此,我们可以建立原节点与clone节点的映射,用一个unordered_map来保存。如果当前遍历的节点在其中,则直接返回 m[curNode] 即可。
DFS
class Solution { public: unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> m; UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if (node==NULL) return NULL; if (m.count(node)) return m[node]; UndirectedGraphNode *newNode=new UndirectedGraphNode(node->label); m[node] = newNode; for (auto neighbor:node->neighbors){ newNode->neighbors.push_back(cloneGraph(neighbor)); } return newNode; } };
BFS
BFS就没有DFS那么好写了。创建好node并建立好映射的原节点才会被Push到queue中。
当这些节点从queue中出来的时候,我们将把该节点的copy节点的neighbors数组处理完毕。此过程中,copy之前没有被copy的neighbor节点并建立映射,这写节点也将被push到queue中(等待出队列处理neighbors数组)。
class Solution { public: unordered_map<UndirectedGraphNode *, UndirectedGraphNode *> m; UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if (node==NULL) return NULL; UndirectedGraphNode *copy=new UndirectedGraphNode(node->label); m[node] = copy; queue<UndirectedGraphNode *> q({node}); while (!q.empty()){ UndirectedGraphNode *cur=q.front(); q.pop(); for (auto neighbor:cur->neighbors){ if (!m.count(neighbor)){ UndirectedGraphNode *copy_neighbor=new UndirectedGraphNode(neighbor->label); m[neighbor] = copy_neighbor; q.push(neighbor); } m[cur]->neighbors.push_back(m[neighbor]); } } return copy; } };
References:
https://leetcode.com/problems/clone-graph/discuss/42313/7-17-lines-C++-BFSDFS-Solutions

浙公网安备 33010602011771号