每天一道leetcode:797. 所有可能的路径(图论&中等&深度优先遍历)

今日份题目:

给你一个有 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)

题目思路

使用深度优先遍历,用p数组记录路径。递归遍历结束条件就是到达结尾,所以需要一个int数据记录当前所在位置,如果到结尾了就返回。

代码

cpp 复制代码
class Solution 
{
public:
    vector<vector<int>> ans;
    vector<int> p;

    void dfs(vector<vector<int>>& graph, int x, int n) 
    { //x用来标记当前所在位置,n标记结尾所在位置
        if(x==n) //到结尾了,返回
        {
            ans.push_back(p);
            return;
        }
        for(auto& y:graph[x]) //遍历临界节点
        {
            p.push_back(y);
            dfs(graph,y,n);
            p.pop_back();//还原队列,确保其他dfs操作的正确进行
        }
    }

    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) 
    {
        p.push_back(0);
        dfs(graph,0,graph.size()-1);
        return ans;
    }
};

提交结果

欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

相关推荐
积流成海12 分钟前
哈希碰撞攻击全解析:从MD5到SHA1的安全演进史
算法·安全·哈希算法·哈希函数·盘子工具站·哈希计算
重生之小比特13 分钟前
【C++进阶】02 Linux基本指令
java·数据库·c++
v:PLLucky2013 分钟前
眼部疾病智能检测系统
算法·yolo·机器学习·百度·facebook
Omics Pro14 分钟前
00后大3休学创业!AI虚拟细胞
大数据·数据库·人工智能·算法·机器学习·自然语言处理
HEJOO916 分钟前
Go 语言结构体定义与实例详解
开发语言·算法·golang
(Charon)18 分钟前
【C++面试】手写智能指针(一):从unique_ptr理解独占所有权与移动语义
开发语言·c++
不懂六月飞雪18 分钟前
高数常用等价无穷小和泰勒公式动态图像
算法
李游Leo22 分钟前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 输入帧内参与位姿的版本一致性门禁【鸿蒙心迹】
c++·3d·harmonyos
YangYang9YangYan35 分钟前
2027 秋招|大数据管理与应用 企业数字化岗位面试高频问题拆解与求职准备
面试·职场和发展
(Charon)35 分钟前
【C++面试】手写智能指针(二):从shared_ptr理解引用计数与共享所有权
c++·算法