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

news/2024/10/25 19:27:51/

图论刷题

  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:
在这里插入图片描述

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

示例2:
在这里插入图片描述

输入: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;}
};

执行效果如图所示:

在这里插入图片描述

补充:

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

总结

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

Smileyan
2023.03.31 13:26


http://www.ppmy.cn/news/38469.html

相关文章

关于Intellij idea 报错:Error : java 不支持发行版本5的问题

在Intellij idea中新建了一个Maven项目&#xff0c;运行时报错如下&#xff1a;Error : java 不支持发行版本5 本地运行用的是JDK9&#xff0c;测试Java的Stream操作&#xff0c;报错应该是项目编译配置使用的Java版本不对&#xff0c;需要检查一下项目及环境使用的Java编译版本…

企业密码管理解决方案

如今&#xff0c;企业用户被创建、管理和更新无数用户名和密码的永无止境的任务所困扰&#xff0c;导致忘记密码、帮助台票证过载以及创建易受攻击的密码。ADSelfService Plus 通过自助密码管理、高级密码策略、密码同步和密码过期通知使您的 IT 管理员和最终用户受益。 密码管…

kingdee 物料中有个特别好的概念,整理一下,拓展开发者的思维

无论是MES、还是ERP等生产方便的应用系统&#xff0c;生产的连续性、计划性都是理想状态的。实际生产很难很难达到的。就跟 【0库存概念一样】是我们追求的动力。 但MES、ERP 确实改善了企业的管理模式、改善管理已有的难点、痛点等顽疾问题。 提前期是指完成某项任务所需的…

OLAP引擎—ClickHouse21.7快速入门

OLAP引擎—ClickHouse21.7入门 一、ck概述 1.1 clickhouse简介 ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的用于在线分析处理查询&#xff08;OLAP :Online Analytical Processing&#xff09;MPP架构的列式存储数据库&#xff08;DBMS&#xff1a;Database Management …

在Vue3中使用NavieUI组件库,美化页面

1 创建Vue3项目 vue create xx 选择Vue3模式 2 安装NavieUI npm i -D naive-ui 3 使用NavieUI 注意&#xff0c;好像只支持按需引用 样例&#xff1a; <template><div class"hello"><h1>{{ msg }}</h1> <!-- 使用--><NButton&…

SQL 获取月份中的第一天

本文介绍如何在各种数据库中使用 SQL 获取月份中的第一天。 Oracle 对于 Oracle 数据库&#xff0c;我们可以使用 TRUNC 函数对日期进行截断。例如&#xff1a; SELECT TRUNC(date 2023-04-06, MM) FROM DUAL;| TRUNC(DATE2023-04-05,MM) | |------------------------------…

进化吧Java接口兽

接口真不错 &#x1f69a;...Java 8 | 不止默认还有静态Java 11 | 私有接口Java 14 | recordJava 15 | Sealed与私有静态私有静态方法Sealed我们终会上岸&#xff0c;⽆论去到哪⾥都是阳光灿烂鲜花开放 java在不停更新, 不同版本有不同的新特征出现, 接口在不同版本有不同的用法…

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?

作者&#xff1a;华钟明 本文我们将介绍 Apache Dubbo 灵活的多协议设计原则&#xff0c;基于这一设计&#xff0c;在 Dubbo 框架底层可灵活的选用 HTTP/2、HTTP/REST、TCP、gRPC、JsonRPC、Hessian2 等任一 RPC 通信协议&#xff0c;同时享用统一的 API 与对等的服务治理能力。…