LeetCode刷题解题思路以及算法实现——图—寻找路径(BFS)

 

目录

前言

题目

描述

解题思路

算法法实现

TIPS:

最后,更多关于数据结构和算法知识请参考我其他的文章哦!!!希望大家有所收获!


前言

对于图的基础知识不了解的可以参考数据结构和算法---图---概念入门(一)这篇文章。

详细介绍关于图的基本知识点,有助于小伙伴们刷题哦!

 

题目

1971. 寻找图中是否有路径

描述

有一个具有 n个顶点的 双向 图,其中每个顶点标记从 0 到 n - 1(包含 0 和 n - 1)。图中的边用一个二维整数数组 edges 表示,其中 edges[i] = [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点对由 最多一条 边连接,并且没有顶点存在与自身相连的边。

请你确定是否存在从顶点 start 开始,到顶点 end 结束的 有效路径

给你数组 edges 和整数 n、start和end,如果从 start 到 end 存在 有效路径 ,则返回 true,否则返回 false。

示例1:

输入:n = 3, edges = [[0,1],[1,2],[2,0]], start = 0, end = 2
输出:true
解释:存在由顶点 0 到顶点 2 的路径:
- 0 → 1 → 2 
- 0 → 2

示例2:

输入:n = 6, edges = [[0,1],[0,2],[3,5],[5,4],[4,3]], start = 0, end = 5
输出:false
解释:不存在由顶点 0 到顶点 5 的路径.

解题思路

BFS

1.先建图:建图grap,grap[i]表示与i相连的点
此时如果目的地 destination 刚好在 grap[sourece] 里,说明目的地与起始点直接相连,return


2.建立深度优先搜索函数dfs
在此过程中,我们把访问过的点存在数组v(visited)里,如果搜索的时候遇到了,说明前面已经走过这条路了,continue
如果搜索到了目的地,return True
起始 is_vaild 是False
从起始点对应的grap[st]开始遍历,遍历到某位置就加到vistied里,递归调用dfs

算法法实现

python3版

class Solution:
    def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
        if n == 1 or source == destination:
            return True
        grap = defaultdict(list)
        #defaultdict(list),会构建一个默认value为list的字典

        for ls in edges:
            grap[ls[0]].append(ls[1])
            grap[ls[1]].append(ls[0])
            
        visited = set()
        is_vaild = False

        def dfs(i):
            nonlocal is_vaild
            # 内层函数未定义此变量is_vaild 通过关键字nonlocal 直接使用此变量
            visited.add(i)
            if is_vaild:
                return
            for j in grap[i]:
                if j in visited:
                    continue
                if j == destination:
                    is_vaild = True
                    return

                dfs(j)

        dfs(source)
        return is_vaild

注意:

nonlocal是 Python3 新增的作用域关键词

用法:如果两个嵌套函数,一个函数A里面又包含了一个函数B,那么对于B中的名称来说A中的作用域就为nonlocal。
作用域:enclosing作用域 —外层非全局作用域
如果要在内层函数中修改外层变量,则需要用到 nonlocal 关键字

为什么不用 global 全局变量?==>>在 Python2 中,闭包函数可以读取到父级函数的变量,但是无法修改变量的值,要把变量声明为 global 全局变量,这样就打破了闭包的性质

TIPS:

对于使用Python来刷数据结构和算法的小伙伴们,一定要了解collections模块!!!

Python内置的数据类型和方法,collections模块在这些内置类型的基础提供了额外的高性能数据类型,比如基础的字典是不支持顺序的,collections模块的OrderedDict类构建的字典可以支持顺序,collections模块的这些扩展的类用处非常大,熟练掌握该模块,可以大大简化Python代码,提高Python代码逼格和效率,高手入门必备!

最后,更多关于数据结构和算法知识请参考我其他的文章哦!!!希望大家有所收获!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值