图中两个点之间的路线

原创 2016年08月29日 09:50:22

题目描述:给出一张有向图,设计一个算法判断两个点 s 与 t 之间是否存在路线。


样例:如下图,




for s = B and t = E, return true

for s = D and t = C, return false


题中的数据结构时有向图,关于有向图的定义其实看下面的代码就很容易明白了:

class DirectedGraphNode:
    def __init__(self, x):
        self.label = x
        self.neighbors = []

也就是说,每个图中的节点所指向的节点在此节点当中有一个列表neigbors负责存储。现在要做的事情是写一个算法判断图中的节点之间是否存在路径,那么可以考虑用广度优先搜索(BFS(breadth-first search))


之前,我已经说过深度优先搜索(详见:点击打开链接),原则是每走到一步就尽可能地“深入”,直到不能再深入为止。那么,其实广度优先搜索于深度优先搜索是相对应的,广度优先搜索的原则是每到一个节点,都尽可能地“延伸”。拿在有向图中搜索为例,扫描到当前节点之后,应该依次先访问这个节点所指向的其他节点,也就是neigbors中存储的节点,再继续访问neigbors中存储节点的neigbors. 话有点绕,看题中的图就容易明白了:一开始访问A,其后访问B, D,再访问C, E. 


显然,依照这个逻辑,可以利用队列先进先出的性质。


代码如下:

# Definition for a Directed graph node
# class DirectedGraphNode:
#     def __init__(self, x):
#         self.label = x
#         self.neighbors = []


class Solution:
    """
    @param graph: A list of Directed graph node
    @param s: the starting Directed graph node
    @param t: the terminal Directed graph node
    @return: a boolean value
    """
    def hasRoute(self, graph, s, t):
        
        # visited表示已经访问了的节点
        visited = [s]
        return self.bfs(graph, s, t, visited)
    
    
    def bfs(self, graph, s, t, visited):
        queue = [s]
        while len(queue) != 0:
            temp = queue.pop(0)
            if temp == t:
                return True
            visited.append(temp)
            for ele in temp.neighbors:
                if ele not in visited:
                    queue.append(ele)
        return False



版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

【Java】给定有向图,设计一个算法,找出两个结点之间是否存在一条路径

给定有向图,设计一个算法,找出两个结点之间是否存在一条路径 通过图的遍历,比如深度优先或者广度优先搜索等,就能解决这个问题 从结点的其中一个出发,在遍历过程中,检查是否找到另一个结点即可 在遍历...

图中两个点之间的路线

题目描述:给出一张有向图,设计一个算法判断两个点 s 与 t 之间是否存在路线。 样例:如下图, for s = B and t = E, return true for s = D and ...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

DFS--图中两点之间的路径

# include # include # include # define MAX 20 //最大顶点数 typedef struct VNODE { int num; //该边...

求图中任意两个顶点间的最短路径

#include using namespace std; const int MAXVERTEXNUM = 100; const int MAX_WEIGHT = 32767; struct MG...

最近的两点

题目:假设有一个集合的点,找出距离最近的两个点。 源代码: import java.util.Scanner; public class FindPoints { public stat...

php返回两个时间点的差距,以非常人性化的显示出来

1.自定义函数(超智能) //返回两个时间点的差距,以非常人性化的显示出来    //函数有两个参数。第一个参数指的是开始时间,默认值是1;第二个参数是现在(或结束)时间,默认是time()f...

二叉树系列——二叉树中任意两个节点之间的最短路径

来源:https://segmentfault.com/a/1190000003465753 题目:给定一棵二叉树的根节点和两个任意节点,返回这两个节点之间的最短路径 思路:两个节...

在地图上绘制两点间的线路图

原理:用google找到两个经纬度之间的路线点,然后在地图上把点用线连起来,就成了线路图 下面看代码: currLocation = [[CLLocation alloc] initWithL...

搜索无向图中两点之间的所有路径(java)

参考 http://topic.csdn.net/u/20110110/11/4d5adf2a-6d13-400d-840b-6bf6ab8373da.html,对代码进行了部分修改,并编写了测试用例...

hdu 2547 (无剑无我)(两点之间线段最短)

无剑无我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)