【力扣】所有可能的路径

🔥博客主页: 我要成为C++领域大神
🎥系列专栏【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于知识分享,与更多的人进行学习交流

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

回溯法

思路

定义两个类成员变量,result存储所有从节点0到节点n-1的路径的二维数组,path存储当前正在构建的路径,是一个一维数组。

深搜三部曲:

参数:首先我们dfs函数一定要存一个图,用来遍历的,需要存一个目前我们遍历的节点,定义为x。

还需要存一个n,表示终点,我们遍历的时候,用来判断当 x==n 时候 标明找到了终点。

终止条件:当 x== n 时,即当前路径到达目标节点,将当前的 path 加入到 result 中,并返回。

单层:对于节点 x 的每一个邻居节点 i(通过 graph[x] 获得),将 i 加入 path 中,并递归调用 dfs(graph, i, n)

回溯:在递归返回后(即递归完毕或遇到终止条件后),需要将最后添加的节点 ipath 中弹出,以便探索其他可能的路径。

代码实现

class Solution {
public:
    vector<vector<int>> result;//存储所有0~n-1的路径
    vector<int> path;//符合要求的一条路径
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        path.push_back(0);//每一个路径都是从0开始的,所以将0存入
        dfs(graph,0,graph.size()-1);
        return result;
    }
    void dfs(vector<vector<int>>& graph,int x,int n)//x是当前遍历到的节点,n是目标节点
    {
        if(x==n)//说明当前路径到了目标节点,将path存入result
        {
            result.push_back(path);
            return;
        }

        for(int i:graph[x]) //遍历二维数组每一层的元素
        {
            path.push_back(i);
            dfs(graph,i,n);//继续向下递归
            path.pop_back(); //回溯,存放下一层的路径。
        }
    }
};
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值