首页 > 其他 > 详细

题解:Leetcode797-所有可能的路径(深搜)

时间:2020-11-16 22:33:29      阅读:29      评论:0      收藏:0      [点我收藏+]

题目:

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

二维数组的第 i 个数组中的单元都表示有向图中 i 号结点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a )空就是没有下一个结点了。


 

示例 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]]


示例 3:

输入:graph = [[1],[]]

输出:[[0,1]]


分析:

本题是一道深度优先搜索,在学习数据结构的图的时候,我们都学过这个概念,当然,它很好理解,可是当你写代码的时候,还能像正常思考一样把它快速搞定吗?

本题的基本思路:

1.递归实现

2.创建一个list代表路径,每次递归增加一个节点,该次递归结束后再把这个节点删除(回溯)

3.当最终找到了终点的时候,把list加入到最终的结果中


代码:

 1 class Solution {
 2 public:
 3     vector<vector<int>> ret;
 4     vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
 5         if(graph.size()==0)
 6         {
 7             return ret;
 8         }
 9         vector<int> list;
10         dfs(0,graph,list);
11         return ret;
12     }
13     void dfs(int curr,vector<vector<int>>& graph,vector<int>& list)
14     //curr代表当前的节点,list代表要传入到ret里面的一个int的向量
15     {
16         list.push_back(curr);
17         if(curr==graph.size()-1)//如果当前节点到达了终点,现在这条list就成功了,可以输入到ret里面了
18         {
19             ret.push_back(list);
20         }
21         for(int i:graph[curr])//递归寻找当前节点的所有可以到达的下一个节点,从而最终可以判断是否能到达终点
22         {
23             dfs(i,graph,list);
24         }
25         list.pop_back();//回溯
26     }
27 };

总结:

如果您也是一名刚刚学习到图的初学者,还没实现过深搜,我建议您自己做一遍这道题,这道题是一道非常典型的深度优先搜索题,思路很清晰,有助于您的代码能力的提高。

 

题解:Leetcode797-所有可能的路径(深搜)

原文:https://www.cnblogs.com/wangqianming12138/p/13988141.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!