提出 #59233624


ソースコード 拡げる

#![allow(unused)]

fn main() {
    let n = read::<usize>();
    let mut edges = vec![];
    for _ in 0..(n - 1) {
        let edge = readv::<i64>();
        let u = edge[0] as usize - 1;
        let v = edge[1] as usize - 1;
        let w = edge[2];
        edges.push((u, v, w));
    }

    edges.sort_by_key(|&(u, v, w)| w);
    let mut dsu = DSU::new(n);
    let mut ans = 0 as i64;
    for (u, v, w) in edges {
        ans += dsu.size(u) as i64 * dsu.size(v) as i64 * w;
        dsu.unite(u, v);
    }
    println!("{}", ans);
}

struct DSU {
    par: Vec<usize>,
    siz: Vec<usize>,
}

impl DSU {
    fn new(n: usize) -> Self {
        Self {
            par: (0..n).collect(),
            siz: vec![1; n],
        }
    }

    fn root(&mut self, u: usize) -> usize {
        if self.par[u] == u {
            u
        } else {
            self.par[u] = self.root(self.par[u]);
            self.par[u]
        }
    }

    fn unite(&mut self, mut u: usize, mut v: usize) {
        u = self.root(u);
        v = self.root(v);
        if u == v {
            return;
        }
        if self.siz[u] > self.siz[v] {
            self.par[v] = u;
            self.siz[u] += self.siz[v];
        } else {
            self.par[u] = v;
            self.siz[v] += self.siz[u];
        }
    }

    fn same(&mut self, u: usize, v: usize) -> bool {
        self.root(u) == self.root(v)
    }

    fn size(&mut self, u: usize) -> usize {
        let r = self.root(u);
        self.siz[r]
    }
}

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn readv<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_ascii_whitespace()
        .map(|t| t.parse().ok().unwrap())
        .collect()
}

fn join<T: ToString>(v: &[T], sep: &str) -> String {
    v.iter()
        .map(|x| x.to_string())
        .collect::<Vec<String>>()
        .join(sep)
}

提出情報

提出日時
問題 D - Sum of Maximum Weights
ユーザ amoshuangyc
言語 Rust (rustc 1.70.0)
得点 400
コード長 2052 Byte
結果 AC
実行時間 23 ms
メモリ 5764 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 400 / 400
結果
AC × 2
AC × 20
セット名 テストケース
Sample example_00.txt, example_01.txt
All example_00.txt, example_01.txt, line.txt, linelike_00.txt, linelike_01.txt, linelike_02.txt, rand_00.txt, rand_01.txt, rand_02.txt, rand_03.txt, rand_04.txt, rand_05.txt, rand_06.txt, rand_07.txt, rand_08.txt, rand_09.txt, star.txt, starlike_00.txt, starlike_01.txt, starlike_02.txt
ケース名 結果 実行時間 メモリ
example_00.txt AC 1 ms 2088 KiB
example_01.txt AC 0 ms 1912 KiB
line.txt AC 22 ms 5680 KiB
linelike_00.txt AC 22 ms 5516 KiB
linelike_01.txt AC 23 ms 5672 KiB
linelike_02.txt AC 22 ms 5688 KiB
rand_00.txt AC 22 ms 5720 KiB
rand_01.txt AC 22 ms 5760 KiB
rand_02.txt AC 7 ms 3100 KiB
rand_03.txt AC 15 ms 4444 KiB
rand_04.txt AC 13 ms 4192 KiB
rand_05.txt AC 2 ms 2024 KiB
rand_06.txt AC 15 ms 4440 KiB
rand_07.txt AC 13 ms 4156 KiB
rand_08.txt AC 1 ms 2080 KiB
rand_09.txt AC 9 ms 3500 KiB
star.txt AC 21 ms 5696 KiB
starlike_00.txt AC 21 ms 5684 KiB
starlike_01.txt AC 22 ms 5740 KiB
starlike_02.txt AC 21 ms 5764 KiB