133. Clone Graph(DFS&BFS)
2018-01-07 22:32
211 查看
1.题目描述
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 node 0 to both nodes 1 and 2. Second node is labeled as 1. Connect node 1 to node 2. Third node is labeled as 2. Connect node 2 to node 2 (itself), thus forming a self-cycle.
Visually, the graph looks like the following:
1 / \ / \ 0 --- 2 / \ \_/
2. 代码
2.1
1.使用到的知识:unordered_map2.参考链接:点击
2.2 DFS实现
/** * 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 node; if(mmp.count(node->label) > 0) return mmp[node->label]; UndirectedGraphNode* newNode = new UndirectedGraphNode(node->label); mmp[node->label] = newNode; for(int i = 0; i < node->neighbors.size(); i++) { (newNode->neighbors).push_back(cloneGraph(node->neighbors[i])); } return newNode; } private: unordered_map<int, UndirectedGraphNode*> mmp; };
2.3 BFS实现
写在前面:1. 这道题应该是用DFS好一点。
2. 下面的BFS解法涉及一点“迭代器”的知识,其实可以用简单的下标访问代替。
UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { // BFS copy. if (node == nullptr) { return nullptr; } queue<UndirectedGraphNode *> BFSQueue; BFSQueue.push(node); unordered_map<int, UndirectedGraphNode *> visited; // Copy the first node. UndirectedGraphNode *copy = new UndirectedGraphNode(node->label); // Mark as visited. visited[node->label] = copy; while (!BFSQueue.empty()) { UndirectedGraphNode *oNode = BFSQueue.front(); BFSQueue.pop(); // Copy the list of its neighbors. vector<UndirectedGraphNode *> oNeighbors = oNode->neighbors; for (vector<UndirectedGraphNode *>::const_iterator it = oNeighbors.begin(); it != oNeighbors.end(); ++it) { if (visited.count((*it)->label) == 0) { UndirectedGraphNode *neighborNode = new UndirectedGraphNode((*it)->label); visited[(*it)->label] = neighborNode; BFSQueue.push(*it); } (visited[oNode->label]->neighbors).push_back(visited[(*it)->label]); } } return copy; }
部分参考leetcode的朋友:参考
邮箱联系:sysuygm@163.com
欢迎指正!
相关文章推荐
- HDU 1241 Oil Deposits【dfs&bfs】
- BFS & DFS(Java实现)
- DFS&&BFS模板
- hdoj 1428 漫步校园 【BFS&&DFS&&记忆化搜索好题】
- 博弈搜索练习-BFS&DFS
- DFS&BFS算法总结(1)
- hdu1241 Oil Deposits(dfs&&bfs)
- DFS&BFS(链式前向星实现)
- POJ_S1E03_DFS&BFS(1)
- 算法学习笔记(一):拓扑排序与传递闭包(通过bfs&&dfs)
- KNOW: BFS & DFS
- 列出连通集(25 分)(DFS&&BFS)
- SDUT_2015寒假集训_BFS&DFS_A-数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- [C++]LeetCode: 129 Clone Graph (图的深拷贝 BFS && DFS)
- SDUT:找朋友 BFS&&DFS
- DFS&BFS板子
- POJ_S1E03_DFS&BFS(3)
- HDU 1241/UVa572 Oil Deposits(DFS&BFS)
- 【NYOJ】-最少步数(DFS || BFS&&队列)
- CH Round #72树洞[二分答案 DFS&&BFS]