797.All Paths From Source to Target
===
###### tags: `Medium`,`Backtracking`,`Depth-First Search`,`Breadth-First Search`,`Graph`
[797. All Paths From Source to Target](https://leetcode.com/problems/all-paths-from-source-to-target/description/)
### 題目描述
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:**
![](https://i.imgur.com/nsBWfMI.png)
```
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:**
![](https://i.imgur.com/kIdFvZP.png)
```
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]]
```
**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.**
### 解答
#### Python
```python=
class Solution:
def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
DAG = defaultdict(list)
paths = []
for u, node in enumerate(graph):
for v in node:
DAG[u].append(v)
def dfs(u, path):
if u == len(graph) - 1:
paths.append(path.copy())
return
for v in DAG[u]:
path.append(v)
dfs(v, path)
path.pop()
dfs(0, [0])
return paths
```
> [name=Kobe][time=Fri, Dec 30, 2022]
### Reference
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)