797. 所有可能的路径(图的遍历)

 

难度中等

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

 graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。

 

示例 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]]
 
 
 
 
class Solution:
    def __init__(self) -> None:
        self.res = []
    def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:

        def dfs(path,graph,node):
            if node >= len(graph)-1:
                path.append(node)
                self.res.append(path.copy())
                path.pop()
                return 
            for children in graph[node]:
                path.append(node)
                dfs(path,graph,children)
                path.pop()

        path = []
        dfs(path,graph,0)
        return self.res

 

 
class Solution {
public:
    vector<vector<int>> res;
    void dfs(vector<int>& path, vector<vector<int>>& graph, int cur_node) {
        path.emplace_back(cur_node);
        if (graph.size()-1 == cur_node) {
            res.emplace_back(path);
            // 可以在这直接 return,但要 pop_back 正确维护 path
            // path.pop_back();
            // return;
            // 不 return 也可以,因为图中不包含环,不会出现无限递归
        }
        for(auto nenbor: graph[cur_node]) {
            dfs(path,graph,nenbor);
        }
        path.pop_back();
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        vector<int> path;
        dfs(path,graph,0);
        return res;
    }
};

 

posted @ 2022-05-16 23:43  乐乐章  阅读(72)  评论(0编辑  收藏  举报