面试题 04.01. 节点间通路(dfs)

1. 问题描述:

 节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。

 示例1:

 输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2
 输出:true

示例2:

 输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4
 输出 true

提示:
节点数量n在[0, 1e5]范围内。
节点编号大于等于 0 小于 n。
图中可能存在自环和平行边。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/route-between-nodes-lcci

2. 思路分析:

① 这个是一道经典的图论问题,非常常规,看是否能够找到一个起点到终点的路径,可以使用dfs或者死bfs进行搜索,因为使用的是python语言来解决的,所以不像Java与c++那样可以使用直接使用一个数组通过下标进行访问,但是在python中可以使用字典的形式来存储图中各个节点之间的关系,通过键值对的形式来进行访问可以到达同样的效果,可以使用defaultdict(list)或者是defaultdict(set)的方法创建字典,括号里面是set表示键中的值是不重复的,这个可以根据题目中具体的条件来决定使用哪一个方法进行创建

② 接下来就是dfs的具体实现了,一开始的时候想到需要使用vis标记数组来标记已经访问过的节点,后面发现是有向图也可以不使用标记数组进行标记,所以后面的话省略了这个标记数组,不过假如我们是无向图的搜索那么就需要使用标记数组来进行标记,这样可以避免两个节点之间的重复递归造成出不来的问题,并且在递归之后进行回溯即可,我们在方法中通过for循环遍历起点,因为是字典的形式来存储的,所以在遍历的时候可以直接找到当前起点可以到达的下一个节点,对于下一个节点也是同样的操作,所以递归下一个节点也就是传入下一个节点作为起点继续搜索,我们在递归方法一开始的时候就可以判断起点是否与终点相等,假如相等那么说明是存在这一条路径的,返回True

③ 我们可以使用有返回值的递归,这样当我们发现存在这一条路径的时候直接返回True即可,这样可以避免继续往下进行搜索了,找到一条存在的路径之后那么层层返回就会直接返回True,否则会一直搜索下去直到全部路径搜索完了之后还没有找到那么最终返回False,整个的dfs过程基本上是这些套路,只是由于题目有所不同,处理的细节不一样而已,大部分的框架其实是差不多的

3. 代码如下:

from typing import List
from collections import defaultdict


class Solution:
    def findWhetherExistsPath(self, n: int, graph: List[List[int]], start: int, target: int) -> bool:
        def dfs(gra, start, target):
            # 出口
            if start == target: return True
            for cur in gra[start]:
                # 发现一个条件满足直接返回True
                if dfs(gra, cur, target): return True
            return False

        # 首先是需要建图: 这个是dfs的核心, 使用字典来存储图中各个节点之间的关系是非常好的
        gra = defaultdict(set)
        for cur in graph:
            gra[cur[0]].add(cur[1])
        return dfs(gra, start, target)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值