797. All Paths From Source to Target

Given a directed, acyclic graph of N nodes.  Find all possible paths from node 0 to node N-1, and return them in any order.

The graph is given as follows:  the nodes are 0, 1, ..., graph.length - 1.  graph[i] is a list of all nodes j for which the edge (i, j) exists.

Example:
Input: [[1,2], [3], [3], []] 
Output: [[0,1,3],[0,2,3]] 
Explanation: The graph looks like this:
0--->1
|    |
v    v
2--->3
There are two paths: 0 -> 1 -> 3 and 0 -> 2 -> 3.

Note:

  • The number of nodes in the graph will be in the range [2, 15].
  • You can print different paths in any order, but you should keep the order of nodes inside one path.
class Solution {
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        List<List<Integer>> res = new ArrayList();
        int n = graph.length;
        Map<Integer, List<Integer>> map = new HashMap();
        for(int i = 0; i < graph.length; i++) {
            for(int j = 0; j < graph[i].length; j++) {
                map.computeIfAbsent(i,l -> new ArrayList<>()).add(graph[i][j]);
            }            
        }
        dfs(res, new ArrayList(), map, 0, n - 1);
        return res;
    }
    
    public void dfs(List<List<Integer>> res, List<Integer> list, Map<Integer, List<Integer>> map, int cur, int end) {
        if(cur == end) {
            list.add(cur);
            res.add(new ArrayList(list));       
            return;
        }
        list.add(cur);
        for(int child: map.get(cur)) {
            dfs(res, list, map, child, end);
            list.remove(list.size() - 1);
        }        
        return;
    }
}

先存成图,然后dfs,因为是DAG,所以不用boolean visited[ ]

原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13375315.html