首页 > 其他 > 详细

leetcode 797. 所有可能的路径

时间:2019-06-24 10:28:37      阅读:184      评论:0      收藏:0      [点我收藏+]

题目描述:

给一个有?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];
    }
};

leetcode 797. 所有可能的路径

原文:https://www.cnblogs.com/zhanzq/p/11075424.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!