797.所有可能的路径
题目描述
给你一个有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]]
提示
- 0 == graph.length
- 2 <= n <= 15
- 0 <= graph[i][j] < n
- graph[i][j] != i(即,不存在自环)
- graph[i]中的所有的元素互不相同
- 保证输入为有向无环图(DAG)
思路:DFS+记忆化
DFS+记忆化
从起点开始,往可以通向的每个点都走一遍到终点,另外需要加一个判断是以n-1结点为终点,这样才是正确的结果。
class Solution:
def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
n = len(graph)
@lru_cache(None)
def dfs(node):
if node == n-1:
return [[n-1]]
ans = []
for nxt in graph[node]:
for res in dfs(nxt):
ans.append([node] + res)
return ans
return dfs(0)