rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;
use std::collections::VecDeque;

impl Solution {
    fn minimum_semesters(n: i32, relations: Vec<Vec<i32>>) -> i32 {
        let n = n as usize;
        let mut adj = vec![vec![]; n];
        let mut degree = vec![0; n];
        for edge in relations {
            let x = edge[0] as usize - 1;
            let y = edge[1] as usize - 1;
            adj[x].push(y);
            degree[y] += 1;
        }
        let mut visited = vec![false; n];
        let mut queue = VecDeque::new();
        for i in 0..n {
            if degree[i] == 0 {
                visited[i] = true;
                queue.push_back(i);
            }
        }
        let mut res = 0;
        while !queue.is_empty() {
            let n = queue.len();
            res += 1;
            for _ in 0..n {
                let u = queue.pop_front().unwrap();
                for &v in adj[u].iter() {
                    degree[v] -= 1;
                    if !visited[v] && degree[v] == 0 {
                        visited[v] = true;
                        queue.push_back(v);
                    }
                }
            }
        }
        if visited.into_iter().all(|x| x) {
            res
        } else {
            -1
        }
    }
}

#[test]
fn test() {
    let n = 3;
    let relations = vec_vec_i32![[1, 3], [2, 3]];
    let res = 2;
    assert_eq!(Solution::minimum_semesters(n, relations), res);
    let n = 3;
    let relations = vec_vec_i32![[1, 2], [2, 3], [3, 1]];
    let res = -1;
    assert_eq!(Solution::minimum_semesters(n, relations), res);
}