题目难度:middle
题目描述:
给你一个有
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]]
解题思路:
本题考查简单的回溯算法,存储所有的路径之和。本题告诉我们路径是从0开始到n-1位置的路径,因此我们可以定义一个vector tmp来先存储0位置,再使用一个循环从0可以走到的位置开始遍历(也就是graph[0][i])从这一点开始深度优先遍历,如果遇见遍历的节点num符合条件,将tmp加入ret中,继续深度优先遍历即可。直接上代码
Coding实现:
class Solution {
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
int n = graph.size()-1;
vector<vector<int>> ret;
for(int i=0;i<graph[0].size();i++){
vector<int> tmp;
tmp.push_back(0);
tmp.push_back(graph[0][i]);
if(graph[0][i] == n){
ret.push_back(tmp);
continue;
}
dfs(graph[0][i],graph,tmp,ret,n);
}
return ret;
}
void dfs(int start,vector<vector<int>>& graph,vector<int>& tmp,vector<vector<int>>&ret,int n){
for(int i = 0;i<graph[start].size();i++){
tmp.push_back(graph[start][i]);
if(graph[start][i] == n){
ret.push_back(tmp);
tmp.pop_back();
continue;
}
dfs(graph[start][i],graph,tmp,ret,n);
tmp.pop_back();
}
}
};