dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub fn check_into_cycle(g: &[Vec<usize>]) -> Vec<bool> {
    let n = g.len();

    let mut to_cycle = vec![false; n];

    let mut state = vec![0; n];

    fn dfs(
        g: &[Vec<usize>],
        to_cycle: &mut [bool],
        state: &mut [u8],
        u: usize,
    ) {
        state[u] = 1;

        for &v in g[u].iter() {
            if state[v] == 0 {
                dfs(g, to_cycle, state, v);
            } else if state[v] == 1 {
                to_cycle[u] = true;
            }

            to_cycle[u] |= to_cycle[v];
        }

        state[u] = 2;
    }

    for i in 0..n {
        if state[i] == 0 {
            dfs(g, &mut to_cycle, &mut state, i);
        }
    }

    to_cycle
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let cases = vec![(
            vec![vec![1], vec![2], vec![3], vec![1, 4], vec![]],
            vec![true, true, true, true, false],
        )];

        for (g, ans) in cases {
            assert_eq!(check_into_cycle(&g), ans);
        }
    }
}