dsalgo 0.3.10

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

    let mut que = std::collections::VecDeque::new();

    let mut bfs = |u: usize| {
        let mut depth = vec![n; n];

        depth[u] = 0;

        que.push_back(u);

        while let Some(u) = que.pop_front() {
            for &v in g[u].iter() {
                if depth[v] != n {
                    continue;
                }

                depth[v] = depth[u] + 1;

                que.push_back(v);
            }
        }

        depth
    };

    let mut d = 0;

    let mut u = 0;

    for _ in 0..2 {
        d = 0;

        let dep = bfs(u);

        for i in 0..n {
            if dep[i] <= d {
                continue;
            }

            d = dep[i];

            u = i;
        }
    }

    d
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let n = 10;

        let edges = vec![
            (6, 5),
            (2, 1),
            (1, 3),
            (3, 4),
            (7, 8),
            (0, 7),
            (0, 5),
            (0, 1),
            (8, 9),
        ];

        let mut g = vec![vec![]; n];

        for (u, v) in edges {
            g[u].push(v);

            g[v].push(u);
        }

        assert_eq!(tree_diameter(&g), 6);
    }
}