博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode--Clone Graph
阅读量:4138 次
发布时间:2019-05-25

本文共 1795 字,大约阅读时间需要 5 分钟。

Depth-first search 深度优先算法,举个例子:二叉树中的前序遍历,一般用递归实现;

Breadth-first search 广度优先算法,举个例子:二叉树的层序遍历,需要用队列实现。

method1:DFS

UndirectedGraphNode *DFS(UndirectedGraphNode *node, unordered_map
*existed){ if (node == NULL) return NULL; UndirectedGraphNode *ret; if ((*existed).find(node->label) == (*existed).end()) { ret = new UndirectedGraphNode(node->label); (*existed)[node->label] = ret; } else { ret = (*existed)[node->label]; return ret; } int n = node->neighbors.size(); int i = 0; while (i
neighbors.push_back( DFS(node->neighbors[i],existed)); i++; } return ret; } UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node) { if (node == NULL) return NULL; unordered_map
*existed = new unordered_map
; return DFS(node, existed); }
method 2:BFS

UndirectedGraphNode *cloneGraphII(UndirectedGraphNode *node) {		if (node == NULL)			return NULL;		unordered_map
visited; queue
Q; UndirectedGraphNode *head = new UndirectedGraphNode(node->label); visited.insert({ node->label, head }); Q.push(node); while (Q.size() > 0) { UndirectedGraphNode *tmp = Q.front(); Q.pop(); int n = tmp->neighbors.size(); head = visited[tmp->label]; for (int i = 0; i < n; ++i) { if (visited.find(tmp->neighbors[i]->label) == visited.end()) { head->neighbors.push_back(new UndirectedGraphNode(tmp->neighbors[i]->label)); Q.push(tmp->neighbors[i]); visited[tmp->neighbors[i]->label] = head->neighbors[i]; } else { head->neighbors.push_back(visited[tmp->neighbors[i]->label]); } } } return visited[node->label]; }

用map记录已经出现过的节点。

C++要注意:vector不能通过下标增加原来没有的原素,map可以; new 和malloc一样返回指针

理论上应该是BFS比较快,因为没有递归调用,但是两个程序的验证时间DFS比较快,可能是程序还可以优化,也可能是因为使用queue?

转载地址:http://thovi.baihongyu.com/

你可能感兴趣的文章
MySQL-数据库、数据表结构操作(SQL)
查看>>
OpenLDAP for Windows 安装手册(2.4.26版)
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
JSP的内置对象及方法
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Spring MVC和Struts2的比较
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Commit our mod to our own repo server
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Simple Guide to use the gdb tool in Android environment
查看>>
Netconsole to capture the log
查看>>
Build GingerBread on 32 bit machine.
查看>>
How to make SD Card world wide writable
查看>>
Detecting Memory Leaks in Kernel
查看>>