1. 所有可能的路径
class Solution:
def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
def dfs(graph, result, path, root): #result 返回结果, path记录路径, root记录遍历到了第几个节点
if root == len(graph) - 1: #如果遍历到最后一个节点,记录结果并返回
result.append(path.copy())
return
for i in graph[root]: #遍历每个节点下一个能到的下一个节点
path.append(i) #path直接添加
dfs(graph, result, path, i) #dfs递归, 输入的root直接变成i,也就是当前遍历的下一个
path.pop() #回溯
result = []
path = [0] #初始化的时候path里已经有最初始的节点位置
root = 0 #起始节点为0
dfs(graph, result, path, root)
return result
实际上就是回溯算法,区别在于:之前做的回溯的题目一般是列表里面一个一个元素遍历,所以在递归的时候有一个star_index变量,控制选与不选当前元素。
而dfs搜索找下一个节点的时候,不用一个个遍历graph中的节点,而是只需要遍历当前节点能到达的节点,因为如果当前节点都到不了的节点,就没有必要往后遍历了。
因此递归的dfs的输入就变成了当前遍历的节点i