rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

impl Solution {
    fn count_subgraphs_for_each_diameter(n: i32, edges: Vec<Vec<i32>>) -> Vec<i32> {
        let n = n as usize;
        let mut adj = vec![vec![]; n];
        for edge in &edges {
            let u = edge[0] as usize - 1;
            let v = edge[1] as usize - 1;
            adj[u].push(v);
            adj[v].push(u);
        }
        let mut res = vec![0; n - 1];
        let full: u32 = (1 << n) as u32 - 1;
        for mask in 1..=full {
            let node_count = mask.count_ones() as usize;
            let mut edge_count = 0;
            for edge in &edges {
                let u = edge[0] as usize - 1;
                let v = edge[1] as usize - 1;
                if (mask & 1 << u) != 0 && (mask & 1 << v) != 0 {
                    edge_count += 1;
                }
            }
            if node_count == 1 || node_count != edge_count + 1 {
                continue;
            }
            let mut u = 0;
            for i in 0..n {
                if (mask & 1 << i) != 0 {
                    u = i;
                    break;
                }
            }
            let mut max = 0;
            let mut mask = mask;
            Self::dfs(u, &mut mask, &mut max, &adj, n);
            res[max - 1] += 1;
        }
        res
    }

    fn dfs(u: usize, mask: &mut u32, max: &mut usize, adj: &[Vec<usize>], n: usize) -> usize {
        *mask ^= 1 << u;
        let mut max_dia = 0;
        for &v in &adj[u] {
            if (*mask & 1 << v) != 0 {
                let dia = Self::dfs(v, mask, max, adj, n);
                *max = (*max).max(max_dia + dia);
                max_dia = max_dia.max(dia);
            }
        }
        max_dia + 1
    }
}

#[test]
fn test() {
    let n = 4;
    let edges = vec_vec_i32![[1, 2], [2, 3], [2, 4]];
    let res = vec![3, 4, 0];
    assert_eq!(Solution::count_subgraphs_for_each_diameter(n, edges), res);
    let n = 2;
    let edges = vec_vec_i32![[1, 2]];
    let res = vec![1];
    assert_eq!(Solution::count_subgraphs_for_each_diameter(n, edges), res);
    let n = 3;
    let edges = vec_vec_i32![[1, 2], [2, 3]];
    let res = vec![2, 1];
    assert_eq!(Solution::count_subgraphs_for_each_diameter(n, edges), res);
}