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
/*
 * No: 820
 * Title: Find Eventual Safe States
 */

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![];

        // Reverse the graph
        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);
            }
        }

        // Topological sort
        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
    }
}