結果

問題 No.1488 Max Score of the Tree
ユーザー phsplsphspls
提出日時 2022-11-04 12:29:56
言語 Rust
(1.77.0)
結果
AC  
実行時間 99 ms / 2,000 ms
コード長 1,584 bytes
コンパイル時間 7,352 ms
コンパイル使用メモリ 142,720 KB
実行使用メモリ 80,356 KB
最終ジャッジ日時 2023-09-25 16:02:11
合計ジャッジ時間 10,564 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 95 ms
76,576 KB
testcase_01 AC 90 ms
73,692 KB
testcase_02 AC 96 ms
77,404 KB
testcase_03 AC 97 ms
80,268 KB
testcase_04 AC 99 ms
80,288 KB
testcase_05 AC 1 ms
4,380 KB
testcase_06 AC 25 ms
21,180 KB
testcase_07 AC 56 ms
46,704 KB
testcase_08 AC 39 ms
32,696 KB
testcase_09 AC 30 ms
23,808 KB
testcase_10 AC 57 ms
47,900 KB
testcase_11 AC 98 ms
80,304 KB
testcase_12 AC 2 ms
4,380 KB
testcase_13 AC 15 ms
13,004 KB
testcase_14 AC 47 ms
39,076 KB
testcase_15 AC 30 ms
24,864 KB
testcase_16 AC 6 ms
6,080 KB
testcase_17 AC 19 ms
15,916 KB
testcase_18 AC 65 ms
54,048 KB
testcase_19 AC 37 ms
30,596 KB
testcase_20 AC 15 ms
13,320 KB
testcase_21 AC 8 ms
7,504 KB
testcase_22 AC 29 ms
24,248 KB
testcase_23 AC 1 ms
4,376 KB
testcase_24 AC 1 ms
4,376 KB
testcase_25 AC 1 ms
4,380 KB
testcase_26 AC 22 ms
19,148 KB
testcase_27 AC 4 ms
4,572 KB
testcase_28 AC 11 ms
10,208 KB
testcase_29 AC 15 ms
12,780 KB
testcase_30 AC 78 ms
64,536 KB
testcase_31 AC 98 ms
80,356 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

fn dfs(cur: usize, prev: usize, paths: &Vec<Vec<(usize, usize)>>, leaves: &mut Vec<usize>) -> usize {
    let mut flg = false;
    let mut ret = 0usize;
    for &(v, _) in paths[cur].iter() {
        if v == prev { continue; }
        flg = true;
        ret += dfs(v, cur, paths, leaves);
    }
    if !flg {
        ret += 1;
    }
    leaves[cur] = ret;
    ret
}

fn main() {
    let mut nk = String::new();
    std::io::stdin().read_line(&mut nk).ok();
    let nk: Vec<usize> = nk.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();
    let n = nk[0];
    let k = nk[1];
    let mut lines = Vec::with_capacity(n-1);
    let mut paths = vec![vec![]; n];
    for _ in 0..n-1 {
        let mut temp = String::new();
        std::io::stdin().read_line(&mut temp).ok();
        let temp: Vec<usize> = temp.trim().split_whitespace().map(|s| s.parse().unwrap()).collect();
        let a = temp[0]-1;
        let b = temp[1]-1;
        let c = temp[2];
        paths[a].push((b, c));
        paths[b].push((a, c));
        lines.push((a, b, c));
    }

    let mut leaves = vec![0usize; n];
    dfs(0, 0, &paths, &mut leaves);
    let mut dp = vec![vec![0usize; k+1]; n];
    let mut score = 0usize;
    for i in 0..n-1 {
        let (a, b, c) = lines[i];
        let addval = c * leaves[a].min(leaves[b]);
        score += addval;
        for j in 0..=k {
            dp[i+1][j] = dp[i+1][j].max(dp[i][j]);
            if j+c <= k {
                dp[i+1][j+c] = dp[i+1][j+c].max(dp[i][j] + addval);
            }
        }
    }
    println!("{}", dp[n-1][k] + score);
}
0