给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为
0
0
0 到
n
−
1
n - 1
n−1 (包括两者)。
给你一个二维整数数组 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 1≤n≤1000
- 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) 0≤edges.length≤min(2000,n∗(n−1)/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 0≤fromi,toi≤n−1
- 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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务