Leetcode 133 克隆图
题目描述:
题解:考察的点是图的遍历,要么DFS要么BFS。一开始一直在想怎么把无向图的边不遗漏的复制出来,想了一些比较复杂的方法。
看了一下别人的做法,其实只需要把无向边看做两条有向边,用一个map来映射每个node对应的copy_node。如果node存在对应的copy_node,说明这个节点
之前访问过,直接返回map的value就可以;如果不存在对应的copy_node,那就新建一个copy_node,然后将对应的边递归的添加就好。
(对于双向图的处理,dfs的设计以及利用mp来替代常规dfs中vis数组的作用)
AC代码:
class Solution { public: Node* dfs(Node* node) { if(node == NULL) return NULL; // cout << node->val <<endl; if(mp.find(node) != mp.end()) return mp[node]; Node* now = new Node(node->val); mp[node] = now; int Len = node->neighbors.size(); for(int i=0;i<Len;i++) { now->neighbors.push_back(dfs(node->neighbors[i])); } return now; } Node* cloneGraph(Node* node) { // if(node == NULL) return NULL; mp.clear(); return dfs(node); } private: map<Node*,Node*> mp; };