rustgym/leetcode/
_1136_parallel_courses.rs

1struct Solution;
2use std::collections::VecDeque;
3
4impl Solution {
5    fn minimum_semesters(n: i32, relations: Vec<Vec<i32>>) -> i32 {
6        let n = n as usize;
7        let mut adj = vec![vec![]; n];
8        let mut degree = vec![0; n];
9        for edge in relations {
10            let x = edge[0] as usize - 1;
11            let y = edge[1] as usize - 1;
12            adj[x].push(y);
13            degree[y] += 1;
14        }
15        let mut visited = vec![false; n];
16        let mut queue = VecDeque::new();
17        for i in 0..n {
18            if degree[i] == 0 {
19                visited[i] = true;
20                queue.push_back(i);
21            }
22        }
23        let mut res = 0;
24        while !queue.is_empty() {
25            let n = queue.len();
26            res += 1;
27            for _ in 0..n {
28                let u = queue.pop_front().unwrap();
29                for &v in adj[u].iter() {
30                    degree[v] -= 1;
31                    if !visited[v] && degree[v] == 0 {
32                        visited[v] = true;
33                        queue.push_back(v);
34                    }
35                }
36            }
37        }
38        if visited.into_iter().all(|x| x) {
39            res
40        } else {
41            -1
42        }
43    }
44}
45
46#[test]
47fn test() {
48    let n = 3;
49    let relations = vec_vec_i32![[1, 3], [2, 3]];
50    let res = 2;
51    assert_eq!(Solution::minimum_semesters(n, relations), res);
52    let n = 3;
53    let relations = vec_vec_i32![[1, 2], [2, 3], [3, 1]];
54    let res = -1;
55    assert_eq!(Solution::minimum_semesters(n, relations), res);
56}