797. All Paths From Source to Target

797. All Paths From Source to Target

1
2
3
4
5
6
7
8
9
Given a directed acyclic graph (DAG) of n nodes labeled from 0 to n - 1, find all possible paths from node 0 to 
node n - 1 and return them in any order.

The graph is given as follows: graph[i] is a list of all nodes you can visit from node i (i.e., there is a directed
edge from node i to node graph[i][j]).



Example 1:


1
2
3
4
Input: graph = [[1,2],[3],[3],[]]
Output: [[0,1,3],[0,2,3]]
Explanation: There are two paths: 0 -> 1 -> 3 and 0 -> 2 -> 3.
Example 2:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Input: graph = [[4,3,1],[3,2,4],[3],[4],[]]
Output: [[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
Example 3:

Input: graph = [[1],[]]
Output: [[0,1]]
Example 4:

Input: graph = [[1,2,3],[2],[3],[]]
Output: [[0,1,2,3],[0,2,3],[0,3]]
Example 5:

Input: graph = [[1,3],[2],[3],[]]
Output: [[0,1,2,3],[0,3]]


Constraints:

n == graph.length
2 <= n <= 15
0 <= graph[i][j] < n
graph[i][j] != i (i.e., there will be no self-loops).
All the elements of graph[i] are unique.
The input graph is guaranteed to be a DAG.

难度 : Medium

##思路
使用dfs+backtracking从0开始扫描记录所有的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> cur = new ArrayList<>();
cur.add(0);
dfs(graph, 0, cur, ans);
return ans;
}

private void dfs(int[][] graph, int node, List<Integer> cur, List<List<Integer>> ans) {
if (node == graph.length - 1) {
ans.add(new ArrayList<>(cur));
return;
}
for (int next : graph[node]) {
cur.add(next);
dfs(graph, next, cur, ans);
cur.remove(cur.size() - 1);
}
}
}