给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 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]]
示例 4:
输入:graph = [[1,2,3],[2],[3],[]] 输出:[[0,1,2,3],[0,2,3],[0,3]]
示例 5:
输入:graph = [[1,3],[2],[3],[]] 输出:[[0,1,2,3],[0,3]]
class Solution {
public:
vector<int> stk;
vector<vector<int>>res;
void dfs(vector<vector<int>>&graph,int begin,int end){
if(begin==end){ //首先判断的是递归的终止条件
res.push_back(stk); //此时将这个栈中的元素入二维数组
return ;
}
for(auto& m:graph[begin]){ //递归过程
stk.push_back(m); //结点入栈
dfs(graph,m,end); //从该结点开始,继续深度遍历
stk.pop_back(); //执行到该步骤,说明dfs已经返回,此时,通过pop使得回到上一分叉点
}
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
stk.push_back(0); //先入栈初始结点,这个是不变的
dfs(graph,0,graph.size()-1); //dfs的目标是从0开始,遍历到size()-1的位置
return res; //递归结束之后,返回二维数组
}
};
执行用时:20 ms, 在所有 C++ 提交中击败了36.72%的用户
内存消耗:11.8 MB, 在所有 C++提交中击败了42.04%的用户