rustgym/leetcode/
_1136_parallel_courses.rs1struct 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}