LeetCode 2192. All Ancestors of a Node in a Directed Acyclic Graph

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
vector<vector<int>> g(n), ans(n);
for (auto &e : edges)
g[e[0]].emplace_back(e[1]);
function<void(int, int)> dfs = [&](int f, int u) {
for (int v : g[u]) {
if (ans[v].empty() || ans[v].back() != f) {
ans[v].emplace_back(f);
dfs(f, v);
}
}
};
for (int i = 0; i < n; ++i)
dfs(i, i);
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
bitset<1000> a[1000];
for (auto &e : edges)
a[e[0]][e[1]] = 1;
for (int v = 0; v < n; ++v)
for (int u = 0; u < n; ++u)
if (a[u][v])
a[u] |= a[v];
vector<vector<int>> ans;
for (int v = 0; v < n; ++v) {
vector<int> f;
for (int u = 0; u < n; ++u)
if (a[u][v])
f.emplace_back(u);
ans.emplace_back(f);
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public:
vector<vector<int>> getAncestors(int n, vector<vector<int>>& edges) {
vector<vector<int>> g(n), ans(n);
vector<int> d(n);
vector<set<int>> f(n);
for (auto &e : edges) {
g[e[0]].emplace_back(e[1]);
++d[e[1]];
}
queue<int> q;
for (int i = 0; i < n; ++i)
if (d[i] == 0)
q.emplace(i);
while (q.size()) {
int u = q.front(); q.pop();
for (int v : g[u]) {
f[v].insert(u);
f[v].insert(f[u].begin(), f[u].end());
if (--d[v] == 0) {
q.emplace(v);
}
}
}
for (int i = 0; i < n; ++i)
ans[i].assign(f[i].begin(), f[i].end());
return ans;
}
};