dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
use crate::adjacency_list_graph_with_edge_id_from_edges::*;

pub fn dfs_tree(
    n: usize,
    edges: &[(usize, usize)],
    root: usize,
) -> Vec<bool> {
    let m = edges.len();

    let mut used = vec![false; m];

    let mut visited = vec![false; m];

    fn dfs(
        g: &[Vec<(usize, usize)>],
        visited: &mut [bool],
        used: &mut [bool],
        u: usize,
    ) {
        visited[u] = true;

        for &(v, eid) in g[u].iter() {
            if visited[v] {
                continue;
            }

            used[eid] = true;

            dfs(g, visited, used, v);
        }
    }

    let g = graph_from_edges(n, edges, false);

    dfs(&g, &mut visited, &mut used, root);

    used
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

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

        for ((n, edges), ans) in cases {
            assert_eq!(dfs_tree(n, &edges, 0), ans);
        }
    }
}