Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 41b043a

Browse files
authored
Update All Ancestors of a Node in a Directed Acyclic Graph.java
1 parent f981b32 commit 41b043a

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed
Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,36 @@
11
class Solution {
2-
public List<List<Integer>> getAncestors(int n, int[][] edges) {
3-
Map<Integer, List<Integer>> graph = new HashMap<>();
4-
for (int[] edge : edges) {
5-
graph.computeIfAbsent(edge[1], k -> new ArrayList<>()).add(edge[0]);
6-
}
7-
List<List<Integer>> result = new ArrayList<>();
8-
for (int i = 0; i < n; i++) {
9-
List<Integer> ancestors = new ArrayList<>();
10-
Set<Integer> visited = new HashSet<>();
11-
Queue<Integer> queue = new LinkedList<>(graph.getOrDefault(i, new ArrayList<>()));
12-
while (!queue.isEmpty()) {
13-
int removed = queue.remove();
14-
if (visited.contains(removed)) {
15-
continue;
2+
public List<List<Integer>> getAncestors(int n, int[][] edges) {
3+
Map<Integer, List<Integer>> graph = new HashMap<>();
4+
int[] indegree = new int[n];
5+
for (int[] edge : edges) {
6+
graph.computeIfAbsent(edge[0], k -> new ArrayList<>()).add(edge[1]);
7+
indegree[edge[1]]++;
8+
}
9+
Queue<Integer> queue = new LinkedList<>();
10+
Map<Integer, Set<Integer>> ancestors = new HashMap<>();
11+
for (int i = 0; i < n; i++) {
12+
if (indegree[i] == 0) {
13+
queue.offer(i);
14+
}
15+
}
16+
while (!queue.isEmpty()) {
17+
int node = queue.poll();
18+
ancestors.computeIfAbsent(node, k -> new HashSet<>());
19+
for (int dependents : graph.getOrDefault(node, Collections.emptyList())) {
20+
ancestors.computeIfAbsent(dependents, k -> new HashSet<>()).add(node);
21+
ancestors.get(dependents).addAll(ancestors.get(node));
22+
indegree[dependents]--;
23+
if (indegree[dependents] == 0) {
24+
queue.offer(dependents);
25+
}
26+
}
27+
}
28+
List<List<Integer>> result = new ArrayList<>();
29+
for (int i = 0; i < n; i++) {
30+
List<Integer> currNodeAncestors = new ArrayList<>(ancestors.getOrDefault(i, Collections.emptySet()));
31+
currNodeAncestors.sort(Comparator.naturalOrder());
32+
result.add(currNodeAncestors);
1633
}
17-
ancestors.add(removed);
18-
visited.add(removed);
19-
queue.addAll(graph.getOrDefault(removed, new ArrayList<>()));
20-
}
21-
Collections.sort(ancestors);
22-
result.add(ancestors);
34+
return result;
2335
}
24-
return result;
25-
}
2636
}

0 commit comments

Comments
 (0)