leetcode797. 所有可能的路径

该博客介绍了如何使用深度优先搜索(DFS)算法解决从图中源节点到目标节点的所有路径查找问题。在给定的有向无环图(DAG)中,通过递归实现DFS,找到所有从0号节点到n-1号节点的路径,并优化了存储路径的方式,避免了额外的空间开销。示例代码展示了具体的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://leetcode-cn.com/problems/all-paths-from-source-to-target/

题意:

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

二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。

译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a 。

方法:深搜递归 

class Solution {
private:
    vector<vector<int>> _graph;
    vector<vector<int>> ans;//存储所有满足要求的向量
    int size;//存储有几个节点
    void dfs(int index,vector<int> vct)//深搜寻找可行的节点
    {
        if(index==size-1)//假如是最后一个节点
        {
            ans.push_back(vct);//将该向量插入答案向量
            return ;
        }
        for(auto i:_graph[index])//枚举
        {
            vct.emplace_back(i);//在向量中插入该元素
            dfs(i,vct);//深搜
            vct.erase(vct.end()-1);//删除最有一个元素
        }
    }
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        _graph = graph;
        size = graph.size();//记录有几个节点
        vector<int> vct;//用来存储一条路径
        vct.emplace_back(0);
        dfs(0,vct);//进行深搜
        return ans;//返回答案
    }
};

优化:直接引用,不用新开存储空间

class Solution {
private:
    void dfs(int index,vector<vector<int>>& graph,int size,vector<int> &vct,vector<vector<int>>& ans)//深搜寻找可行的节点
    {
        if(index==size-1)//假如是最后一个节点
        {
            ans.push_back(vct);//将该向量插入答案向量
            return ;
        }
        for(auto i:graph[index])//枚举
        {
            vct.emplace_back(i);//在向量中插入该元素
            dfs(i,graph,size,vct,ans);//深搜
            vct.pop_back();//删除最有一个元素
        }
    }
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        vector<vector<int>> ans;//存储所有满足要求的向量
        int size = graph.size();//记录有几个节点
        vector<int> vct;//用来存储一条路径
        vct.emplace_back(0);
        dfs(0,graph,size,vct,ans);//进行深搜
        return ans;//返回答案
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值