【图论刷题-6】力扣 797. 所有可能的路径

这篇具有很好参考价值的文章主要介绍了【图论刷题-6】力扣 797. 所有可能的路径。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图论刷题

  1. 机器人的运动范围
  2. 矩阵中的路径
  3. 图像渲染
  4. 水位上升的泳池中游泳
  5. 寻找图中是否存在路径
  6. 所有可能的路径

797. 所有可能的路径

力扣地址:https://leetcode.cn/problems/all-paths-from-source-to-target/

这是一道比较典型的深度优先遍历、广度优先遍历案例,强烈推荐初学者完成这道题并且常常回来看看(也欢迎来看看我的博客 ~ )

难度:中等

  • 深度优先遍历
  • 广度优先遍历

问题描述

给你一个有 n 个节点的 有向无环图DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j] 存在一条有向边)。

示例 1:
【图论刷题-6】力扣 797. 所有可能的路径

输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例2:
【图论刷题-6】力扣 797. 所有可能的路径

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

提示:

  • n == graph.length
  • 2 <= n <= 15
  • 0 <= graph[i][j] < n
  • graph[i][j] != i(即不存在自环)
  • graph[i] 中的所有元素 互不相同
  • 保证输入为 有向无环图DAG

问题分析

理解题目

以示例1 为例,输入的是 graph = [[1,2],[3],[3],[]] ,也就是graph[0] = [1, 2] 表示 索引为 0 的点可以到达 12 两个点,graph[1] = [3] 表示索引为 1 的点可以到达 3。也就是说,graph[i] 即表示索引为 i 的点可以到达的点。

输出结果表示从起点(索引为0) 到终点索引为 n-1 的所有路径。比如这个例子输出的结果为 [[0,1,3],[0,2,3]] 即表示 03 的所有路径。

引如深度优先遍历

首先回顾一下深度优先遍历的写法,也可以参考一下我们完成的第一道题:机器人的运动范围 ,接着我们需要确定深度遍历的 遍历规则,也就是 当前点可以到达的下一个点 ,最后我们开始遍历的时候必须指定结束的条件,这个题目中,我们的结束条件就是访问到的点的索引为 n-1

代码实现

class Solution {
public:
    // 所有的路径
    vector<vector<int>> allWays;
    // 现在走的路
    vector<int> oneWay;
    
    /**
     * 深度遍历图路径,因为是有向无环图所以不用考虑 "走回头路" 这种情况
     * 我们tarvel的目标是前往索引为 n - 1 的点 
     */
    void travel(vector<vector<int>>& graph, int current) {
        // 到达终点
        if (current == graph.size() - 1) {
            allWays.push_back(oneWay);
            return;
        }
        // graph[current] 表示当前点能够去的所有风景区,我们现在每个地方都去看看能不能到终点
        for (auto next : graph[current]) {
            // 记录一下我们当前走的路
            oneWay.push_back(next);
            travel(graph, next);
            // 不管前面的道路有没有到达,我们回到前一个地方
            oneWay.pop_back();
        }
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        oneWay.push_back(0);
        travel(graph, 0);
        return allWays;
    }
};

执行效果如图所示:

【图论刷题-6】力扣 797. 所有可能的路径

补充:

  • 这道题明确提示了 有向无环图,这里的 无环 告诉我们不需要考虑 走回头路 的问题,所以不用担心 travel 不终止 问题;
  • oneWay 也可以是栈,因为我们时钟只是操作 top 的那个位置的点。

总结

一般而言,有向图比无向图更加复杂,但是有向无环图很显然简单得多,因为我们不需要考虑绕了一圈回到原点的难题,只要我们能继续向前,那么每次去的地方一定是新的点,我们如果确定前方没有路了,就可以确定这个点不能到达终点,可以 回头 看看 来时的路

Smileyan
2023.03.31 13:26文章来源地址https://www.toymoban.com/news/detail-458594.html

到了这里,关于【图论刷题-6】力扣 797. 所有可能的路径的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 力扣 257. 二叉树的所有路径

    力扣 257. 二叉树的所有路径

    题目来源:https://leetcode.cn/problems/binary-tree-paths/description/    C++题解1:使用递归,声明了全局变量result,遇到叶子节点就将字符串添加到result中。 递归三步法: 1. 确认传入参数:当前节点+已有路径(字符串); 2. 确认终止条件:遇到叶子节点,即左右节点都为空时,将当前

    2024年02月11日
    浏览(10)
  • LeetCode刷题--- 二叉树的所有路径

    LeetCode刷题--- 二叉树的所有路径

    个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题       【     】 【C++】                  【   】 数据结构与算法       【    】 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的

    2024年01月19日
    浏览(11)
  • 力扣算法刷题Day39|动态规划:不同路径 I&II

    力扣题目:#62.不同路径 刷题时长:参考题解后10min 解题方法:动规 复杂度分析 时间O(m*n) 空间O(m*n) 问题总结 初始化二维数组的python语法:i 对应 m,j 对应n 二维遍历顺序,从上到下从左到右通过两层for循环实现,其中startindex应为1 本题收获 动规思路 确定dp数组及下标的含义

    2024年02月12日
    浏览(9)
  • 算法刷题Day 17 平衡二叉树+二叉树的所有路径+左叶子之和

    计算左右两棵子树的高度,如果有一个高度是-1(有一棵子树不平衡),直接返回-1,否则计算高度差,判断是否不平衡 使用 回溯 的方法,每次处理一个节点之前要把它push进table里,处理完之后又要把它pop出来 处理一个节点时,要判断它是否是左节点(需要父节点,可以通

    2024年02月15日
    浏览(13)
  • 白盒测试(路径测试就是设计足够的测试用例,覆盖程序中所有可能的路 径、判定覆盖、条件覆盖)

    白盒测试(路径测试就是设计足够的测试用例,覆盖程序中所有可能的路 径、判定覆盖、条件覆盖)

    重点:白盒测试(路径覆盖、判定覆盖、条件覆盖) ​​​​​​​ 包含了分支覆盖,但与谓词覆盖无关。要求走完所有的路径。如下图,设计测试用力时,有四条路径,需要走完这四条路径。 软件测试的目的: GlenMyers给出的软件测试目的: 1.测试是一个为了发现错误而执

    2023年04月09日
    浏览(10)
  • 力扣-图论

    深度优先搜索 剑指 Offer II 111. 计算除法 我的题解: **思路:* 字符串a / b = 2.0 , b / c = 3.0 可以求: b / c = 3.0, c / b = 1.0 / 3.0, 因此我们可以将a / b描述为从a到b的一条边,这样就抽象画出一张图,我们将所有的点与权值加入图中,然后遍历queries首先看这两个字符是否包含在图中若没

    2024年02月13日
    浏览(3)
  • 刷题日记09《图论基础》

    刷题日记09《图论基础》

    对于图结构而言,常见的存储结构主要有两种:邻接表和邻接矩阵:   邻接表很直观,我把每个节点  x  的邻居都存到一个列表里,然后把  x  和这个列表关联起来,这样就可以通过一个节点  x  找到它的所有相邻节点。 邻接矩阵则是一个二维布尔数组,我们权且称为 

    2024年02月16日
    浏览(6)
  • 输出所有可能的拓扑排序

    输出所有可能的拓扑排序

    对于一个有向无环图 由某个集合上的一个偏序得到该集合上的一个全序的操作过程称为拓扑排序。 通俗易懂的说就是,想要的到一个有先后顺序的序列。 比如要上课,要先学了一年级的数学,才能学二年级的数学课一样。但学习几年级的语文课,对你要学习数学课没有影响

    2024年02月09日
    浏览(10)
  • 1.12 力扣中等图论

    1.12 力扣中等图论

    797. 所有可能的路径 - 力扣(LeetCode) 给你一个有  n  个节点的  有向无环图(DAG) ,请你找出所有从节点  0  到节点  n-1  的路径并输出( 不要求按特定顺序 )   graph[i]  是一个从节点  i  可以访问的所有节点的列表(即从节点  i  到节点  graph[i][j] 存在一条有向边)

    2024年01月22日
    浏览(11)
  • 1.19 力扣中等图论

    200. 岛屿数量 给你一个由  \\\'1\\\' (陆地)和  \\\'0\\\' (水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 示例 2: 使用DFS深度搜

    2024年01月20日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包