leetcode 797. 所有可能的路径

目录

题目描述:

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

二维数组的第 i 个数组中的单元都表示有向图中 i 号结点所能到达的下一些结点(译者注:有向图是有方向的,即规定了a→b你就不能从b→a)空就是没有下一个结点了。

示例:

输入: [[1,2], [3], [3], []] 
输出: [[0,1,3],[0,2,3]] 
解释: 图是这样的:
    0--->1
    |    |
    v    v
    2--->3
    这有两条路: 0 -> 1 -> 3 和 0 -> 2 -> 3.

提示:

  • 结点的数量会在范围 [2, 15] 内。
  • 你可以把路径以任意顺序输出,但在路径内的结点的顺序必须保证。

解法:

# define VI vector<int>
# define VVI vector<VI>
# define VVVI vector<VVI>
class Solution {
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        int n = graph.size();
        VVVI lst(n);
        VI degree(n, 0);
        for(int i = 0; i < n; i++){
            // lst[i] = {};
            for(int next : graph[i]){
                degree[next]++;
            }
        }
        stack<int> stk;
        for(int i = 0; i < n; i++){
            if(degree[i] == 0){
                stk.push(i);
                lst[i] = {{i}};
            }
        }
        while(!stk.empty()){
            int node = stk.top();
            // cout<<"node="<<node<<endl;
            stk.pop();
            for(int next : graph[node]){
                degree[next]--;
                if(degree[next] == 0){
                    stk.push(next);
                }
                for(VI vi : lst[node]){
                    VI path = vi;
                    path.push_back(next);
                    lst[next].push_back(path);
                }
            }
        }
        return lst[n-1];
    }
};
上一篇:AcWing 797. 差分


下一篇:数据输出机制之Model、Map及ModelMap回顾