首页 > 代码库 > 专题4-图论和DFS、BFS
专题4-图论和DFS、BFS
1图论:
1.1 133. Clone Graph
https://leetcode.com/problems/clone-graph/#/description
思路:这题可以对照拷贝随机链表那道题,首先拷贝图中的节点,然后拷贝每个结点的neighbors数组。
这题使用BFS,所有的BFS都可以看成是queue和unordered_map的组合实现的,该题模拟实现了一个queue,主要是因为后面要判断某个元素是否已经访问,所以使用一个vector来模拟操作,传统的queue会弹出元素,还需要一个vector来辅助,比较麻烦。拷贝节点前要使用一个if(Map.find(cur -> neighbors[i]) == Map.end()),没找到才将元素复制到一个map里面,key是旧节点,value是新节点,记住因为是拷贝,所以新节点必须是new出来的节点,不然指针还是指向原来的元素,出错。后面拷贝neighbor数组的时候也要注意这点,必须将map中的value当成拷贝数组中的元素(这点很重要)。 Map[qNode[j]] -> neighbors.push_back( Map[ qNode[j] -> neighbors[k] ] );
map操作总结:
插入使用insert函数,查找每个元素是否在map里面,使用map.find(),如果没找到就对应的指针指向map.end();
使用下标操作找到对应的value,如果需要找的key不在map里面,就会自动将可以保存起来,默认初始化,比如map里面没有1,执行下标操作map[1]之后,map里面就会有 1.
insert插入和make_pair组合使用。
/** * Definition for undirected graph. * struct UndirectedGraphNode { * int label; * vector<UndirectedGraphNode *> neighbors; * UndirectedGraphNode(int x) : label(x) {}; * }; */ class Solution { public: UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if(node == NULL){ return NULL; } vector<UndirectedGraphNode *> qNode; unordered_map<UndirectedGraphNode *,UndirectedGraphNode *> Map; qNode.push_back(node); Map.insert(make_pair(node,new UndirectedGraphNode(node -> label))); int start = 0; //clone nodes while(start < qNode.size()){ UndirectedGraphNode *cur = qNode[start]; for(int i= 0;i < cur -> neighbors.size();++i){ if(Map.find(cur -> neighbors[i]) == Map.end()){ qNode.push_back(cur -> neighbors[i]); Map.insert(make_pair(cur -> neighbors[i], new UndirectedGraphNode(cur -> neighbors[i] -> label))); } } ++start; } // clone neighbors for(int j = 0;j < qNode.size();++j){ for(int k = 0;k < qNode[j] -> neighbors.size();++k){ // UndirectedGraphNode *tmp = new UndirectedGraphNode(qNode[j] -> neighbors[k] -> label); Map[qNode[j]] -> neighbors.push_back(Map[qNode[j] -> neighbors[k]]); } } return Map[node]; } };
专题4-图论和DFS、BFS