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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use crate::Solution;
impl Solution {
pub fn eventual_safe_nodes(graph: Vec<Vec<i32>>) -> Vec<i32> {
use std::collections::{HashMap, HashSet, VecDeque};
let len = graph.len();
let mut reverse_graph: HashMap<usize, HashSet<usize>> = HashMap::new();
let mut indegrees: Vec<usize> = vec![0; len];
let mut queue = VecDeque::<usize>::new();
let mut res = vec![];
for (v, us) in graph.iter().enumerate() {
indegrees[v as usize] = us.len();
if indegrees[v as usize] == 0 {
queue.push_back(v);
}
for u in us {
reverse_graph
.entry(*u as usize)
.or_insert(HashSet::new())
.insert(v);
}
}
while !queue.is_empty() {
let curr = queue.pop_front().unwrap();
res.push(curr as i32);
if let Some(vs) = reverse_graph.get(&(curr)) {
for v in vs {
indegrees[*v] -= 1;
if indegrees[*v] == 0 {
queue.push_back(*v);
}
}
}
}
res.sort();
res
}
}