题目:(所有路径)给定一个有 n 个节点的有向无环图,用二维数组 graph 表示,请找到所有从 0 到 n-1 的路径并输出(不要求按顺序)graph 的第 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]]
提示:
n == graph.length 2 <= n <= 15 0 <= graph[i][j] < n graph[i][j] != i
保证输入为有向无环图 (GAD)
程序说明:
运用深度搜索方式即可求出所有路径,因为此题是一个有向无环图,因此不用考虑是否有重复的路径。
简单解释一下什么是“图”:是一种比树更为复杂的数据结构。树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点之间是多对多的关系,并且所有顶点都是平等的,如图所示,每个原点便称作顶点;而图中每个顶点之间的距离却是不完全相等的,每条边称作权重。
顶点之间的边有了方向的区分,这种带有方向的图被称为有向图,如图所示
全部代码:
class Solution:
def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
li= [0]*len(graph)
num = [0]
res = []
def dfs(i,num):
if i == len(graph)-1:
res.append(list(num))
for j in graph[i]:
if li[j] == 0:
li[j] = 1
num.append(j)
dfs(j,num)
num.pop(-1)
li[j] = 0
li[0] = 1
dfs(0,num)
return res
题目来源:力扣(leetcode)