题目
一个有向无环图由n个节点(标号从0到n-1,n≥2)组成,请找出从节点0到节点n-1的所有路径。图用一个数组graph表示,数组的graph[i]包含所有从节点i能直接到达的节点。例如,输入数组graph为[[1,2],[3],[3],[]],则输出两条从节点0到节点3的路径,分别为0→1→3和0→2→3。
分析
由于这个题目要求列出从节点0到节点n-1的所有路径,因此深度优先搜索是更合适的选择。
当从节点i出发能够抵达的所有节点都搜索完毕之后,将回到前一个节点搜索其他与之相邻的节点。在回到前一个节点之前,需要将节点i从路径中删除。
解
public class Test {public static void main(String[] args) {int[][] graph = {{1, 2}, {3}, {3}, {}};List<List<Integer>> result = allPathsSourceTarget(graph);System.out.println(result);}public static List<List<Integer>> allPathsSourceTarget(int[][] graph) {List<List<Integer>> result = new LinkedList<>();List<Integer> path = new LinkedList<>();dfs(0, graph, path, result);return result;}private static void dfs(int source, int[][] graph, List<Integer> path, List<List<Integer>> result) {path.add(source);if (source == graph.length - 1) {result.add(new LinkedList<>(path));}else {for (int next : graph[source]) {dfs(next, graph, path, result);}}path.remove(path.size() - 1);}}