Formatted question description: https://leetcode.ca/all/797.html

# 797. All Paths From Source to Target

Medium

## Description

Given a directed, acyclic graph of N nodes. Find all possible paths from node 0 to node N-1, and return them in any order.

The graph is given as follows: the nodes are 0, 1, …, graph.length - 1. graph[i] is a list of all nodes j for which the edge (i, j) exists.

Example:

Input: [[1,2], [3], [3], []]
Output: [[0,1,3],[0,2,3]]
Explanation: The graph looks like this:
0--->1
|    |
v    v
2--->3
There are two paths: 0 -> 1 -> 3 and 0 -> 2 -> 3.


Note:

• The number of nodes in the graph will be in the range [2, 15].
• You can print different paths in any order, but you should keep the order of nodes inside one path.

## Solution

Use breadth first search. Starting from node 0, each time obtain the next nodes from graph, and move to the next nodes. For each node visited, maintain the current path as well. If the target node N-1 is met, add the path to the result list. Finally, return the result list.

• class Solution {
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> allPathsList = new ArrayList<List<Integer>>();
int nodes = graph.length;
int target = nodes - 1;
nodesQueue.offer(0);
List<Integer> initialList = new ArrayList<Integer>();
pathsQueue.offer(initialList);
while (!nodesQueue.isEmpty()) {
int node = nodesQueue.poll();
List<Integer> prevPath = pathsQueue.poll();
int[] nextNodes = graph[node];
for (int nextNode : nextNodes) {
List<Integer> curPath = new ArrayList<Integer>(prevPath);
if (nextNode == target)
else {
nodesQueue.offer(nextNode);
pathsQueue.offer(curPath);
}
}
}
return allPathsList;
}
}

• // OJ: https://leetcode.com/problems/all-paths-from-source-to-target/
// Time: O(N * 2^N)
// Space: O(N) extra space
class Solution {
public:
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& G) {
vector<int> path;
vector<vector<int>> ans;
int N = G.size();
function<void(int)> dfs = [&](int u) {
path.push_back(u);
if (u == N - 1) ans.push_back(path);
else {
for (int v : G[u]) dfs(v);
}
path.pop_back();
};
dfs(0);
return ans;
}
};

• class Solution(object):
def allPathsSourceTarget(self, graph):
"""
:type graph: List[List[int]]
:rtype: List[List[int]]
"""
res = []
self.dfs(graph, res, 0, [0])
return res

def dfs(self, graph, res, pos, path):
if pos == len(graph) - 1:
res.append(path)
return
else:
for n in graph[pos]:
self.dfs(graph, res, n, path + [n])