Given a directed graph, design an algorithm to find out whether there is a route between nodes.

这道题让我们判断给定的一个图的任意两个节点间是否有路径。首先我们要知道如何定义一个图, 一般最常用的两种表示图的方法是: Adjacency Matrix 和 Adjacency List

对选择用哪种方法来表示图取决于你要做什么样的操作和使用的难易程度。下面稍微总结了一下这两种方法的优缺点:

Adjacency Matrix

优点:邻接矩阵容易表示并且是用的过程可以清楚的看到节点之间的关系。删除一条边需要O(1)时间复杂度,判断两个节点间是否有路径非常快,只需要O(1)时间复杂度。

缺点:空间复杂度比较大O(V^2). 即使是稀疏矩阵也需要同样的空间。如果增加一个节点需要O(V^2)的时间复杂度。

Adjacency List

 class Node
attr_accessor :name, :neighbors def initialize(name)
@name = name
@neighbors = []
end
end class Graph
attr_accessor :nodes def initialize
@nodes = []
end
end

优点:节省空间O(V+E). 增加一个节点很容易O(1)。

缺点:判断两个节点是否右边不是很快,需要O(V)的时间复杂度。

所以这道题在使用不同的图的表示方法的时候,判断两点间的路径方法是不一样的。我们假设使用Adjacency List的方法来表示图。

如何判断节点间是否有路径呢?这道题很简单,我们只需要使用DFS或者BFS来遍历整个图就可以了。

参见如下代码:

BFS Version

class Node
attr_accessor :name, :neighbors, :visited def initialize(name)
@name = name
@neighbors = []
@visited = false
end
end def has_route?(node1, node2)
return false if node1.nil? || node2.nil? q = Queue.new
node1.visited = true
q << node1 while !q.empty?
cur = q.pop return true if cur.name == node2.name cur.neighbors.each do |n|
if !n.visited
n.visited = true
q << n
end
end
end
false
end

DFS Version

class Node
attr_accessor :name, :neighbors, :visited def initialize(name)
@name = name
@neighbors = []
@visited = false
end
end def has_route?(node1, node2)
return false if node1.nil? || node2.nil?
return true if node1.name == node2.name node1.visited = true
node1.neighbors.each do |n|
next if n.visited
if has_route?(n, node2)
return true
end
end
false
end

[Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径的更多相关文章

  1. Cracking the Coding Interview(Trees and Graphs)

    Cracking the Coding Interview(Trees and Graphs) 树和图的训练平时相对很少,还是要加强训练一些树和图的基础算法.自己对树节点的设计应该不是很合理,多多少少 ...

  2. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  3. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  4. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  5. 《Cracking the Coding Interview》读书笔记

    <Cracking the Coding Interview>是适合硅谷技术面试的一本面试指南,因为题目分类清晰,风格比较靠谱,所以广受推崇. 以下是我的读书笔记,基本都是每章的课后习题解 ...

  6. Cracking the coding interview目录及资料收集

    前言 <Cracking the coding interview>是一本被许多人极力推荐的程序员面试书籍, 详情可见:http://www.careercup.com/book. 第六版 ...

  7. 《Cracking the Coding Interview》——第13章:C和C++——题目6

    2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构 ...

  8. 《Cracking the Coding Interview》——第5章:位操作——题目7

    2014-03-19 06:27 题目:有一个数组里包含了0~n中除了某个整数m之外的所有整数,你要设法找出这个m.限制条件为每次你只能用O(1)的时间访问第i个元素的第j位二进制位. 解法:0~n的 ...

  9. 二刷Cracking the Coding Interview(CC150第五版)

    第18章---高度难题 1,-------另类加法.实现加法. 另类加法 参与人数:327时间限制:3秒空间限制:32768K 算法知识视频讲解 题目描述 请编写一个函数,将两个数字相加.不得使用+或 ...

随机推荐

  1. ES6 Map遍历、filter()筛选对象

    目录: -------- 1.map() -------- 2.filter(): ------------- 2.1.filter函数可以看成是一个过滤函数,返回符合条件的元素的数组 ------- ...

  2. python 图形界面

    Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用. Tk是一个图形库,支持多个操作系统 导入Tkinter包的所有内容: from tkinter i ...

  3. C#中的"?"和"??"

    摘自:http://www.cnblogs.com/zxjyuan/archive/2009/10/27/1590795.html 如果你看到C#中的“?”问号脑袋里便充满问号,那么这个贴子便是为你而 ...

  4. 二、基于事件的异步编程模式(EAP)

    一.引言 在上一个专题中为大家介绍了.NET 1.0中提出来的异步编程模式--APM,虽然APM为我们实现异步编程提供了一定的支持,同时它也存在着一些明显的问题--不支持对异步操作的取消和没有提供对进 ...

  5. 邮件营销巧妙添加GIF让您的邮件动起来

    动态图片远比静态图片要吸引人,因此近年来,一些营销人员也开始越来越频繁的使用GIF动画图片,适当的穿插和点缀动态图片,能够生动形象的表达出 主题,并且时不时令读者忍俊不禁.尤其是做邮件营销的,如果能在 ...

  6. 025__name__变量和目录结构规范

    ##__name__变量被其他模块调用的时候就不是main,所以就有这种使用if __name__=='__main__': ##软件目录结构规范为什么要设计好目录结构?"设计项目目录结构& ...

  7. MATLAB基础指令操作

    由于课程实验需要学习使用了MATLAB,在此记录一下MATLAB的基本操作和命令,供参考与查阅. 学习过程中的资料也链接如下: MATLAB矩阵运算:https://wenku.baidu.com/v ...

  8. Spring AOP 的切点切在Controller上没有起作用的问题。

    做下笔记,以防忘记. 在Spring MVC 中使用面向切面编程,感觉所有的配置.切面.切点的编写都没有写错,但是当切点切在@Controller注解的类的方法上时就不起作用.当切点切在的其他的非@C ...

  9. maven 根据P参数值打包动态修改properties文件中值或一定properties

    需求:由于最近开发clover项目 ,没有使用spring,更没有使用任何框架,而使用J2EE的web工程,所以连接ZK和MongoDB.Redis等服务器需用指定properties文件, 而目前公 ...

  10. 【luogu P1939 【模板】矩阵加速(数列)】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1939 对于矩阵推序列的式子: 由题意知: f[x+1] =1f[x] + 0f[x-1] + 1f[x-2] ...