您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页【Leetcode】2192. 有向无环图中一个节点的所有祖先

【Leetcode】2192. 有向无环图中一个节点的所有祖先

来源:五一七教育网

题目


给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 0 0 n − 1 n - 1 n1 (包括两者)。

给你一个二维整数数组 e d g e s edges edges ,其中 e d g e s [ i ] = [ f r o m i , t o i ] edges[i] = [from_i, to_i] edges[i]=[fromi,toi] 表示图中一条从 f r o m i from_i fromi t o i to_i toi 的单向边。

请你返回一个数组 a n s w e r answer answer,其中 a n s w e r [ i ] answer[i] answer[i]是第 i i i 个节点的所有 祖先 ,这些祖先节点 升序 排序。

如果 u u u 通过一系列边,能够到达 v v v ,那么我们称节点 u u u 是节点 v v v祖先 节点。

输入:n = 8, edgeList = [[0,3],[0,4],[1,3],[2,4],[2,7],[3,5],[3,6],[3,7],[4,6]]
输出:[[],[],[],[0,1],[0,2],[0,1,3],[0,1,2,3,4],[0,1,2,3]]
解释
上图为输入所对应的图。

  • 节点 0 ,1 和 2 没有任何祖先。
  • 节点 3 有 2 个祖先 0 和 1 。
  • 节点 4 有 2 个祖先 0 和 2 。
  • 节点 5 有 3 个祖先 0 ,1 和 3 。
  • 节点 6 有 5 个祖先 0 ,1 ,2 ,3 和 4 。
  • 节点 7 有 4 个祖先 0 ,1 ,2 和 3 。

示例 2

  • 节点 0 没有任何祖先。
  • 节点 1 有 1 个祖先 0 。
  • 节点 2 有 2 个祖先 0 和 1 。
  • 节点 3 有 3 个祖先 0 ,1 和 2 。
  • 节点 4 有 4 个祖先 0 ,1 ,2 和 3 。

提示

  • 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000
  • 0 ≤ e d g e s . l e n g t h ≤ m i n ( 2000 , n ∗ ( n − 1 ) / 2 ) 0 \leq edges.length \leq min(2000, n * (n - 1) / 2) 0edges.lengthmin(2000,n(n1)/2)
  • e d g e s [ i ] . l e n g t h = = 2 edges[i].length == 2 edges[i].length==2
  • 0 ≤ f r o m i , t o i ≤ n − 1 0 \leq from_i, to_i \leq n - 1 0fromi,toin1
  • f r o m i ≠ t o i from_i \neq to_i fromi=toi
  • 图中不会有重边。
  • 图是 有向无环 的。

思路

要求找出有向无环图(DAG)中每个节点的所有祖先节点。由于图是无环的,可以使用深度优先搜索(DFS)来解决这个问题

代码

class Solution {
public:
    vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
        vector<vector<int>> g(n, vector<int>());
        auto res = g;
        for(const auto& now : edges) {
            int a = now[0], b = now[1];
            g[b].push_back(a);
        }
        vector<bool> vis(n, false);
        function<void(int)> dfs = [&](int ver) {
            if(vis[ver]) return;
            vis[ver] = true;
            for(const auto& toVer : g[ver]) {
                dfs(toVer);
            }
        };
        for(int i = 0; i < n; i++) {
            vis.assign(n, false);
            dfs(i);
            vis[i] = false;
            for(int j = 0; j < n; j++) {
                if(vis[j]) res[i].push_back(j);
            }
        }
        return res;
    }
};

复杂度分析

时间复杂度

O ( n + m ) O(n + m) O(n+m),其中 n n n 是节点数, m m m 是边数。

空间复杂度

O ( n ) O(n) O(n),主要是存储邻接表和访问标记数组的空间开销。

结果

总结

通过深度优先搜索(DFS)来解决有向无环图中的祖先节点问题。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务