結果

問題 No.1488 Max Score of the Tree
ユーザー phsplsphspls
提出日時 2022-11-04 12:29:56
言語 Rust
(1.77.0 + proconio)
結果
AC  
実行時間 96 ms / 2,000 ms
コード長 1,584 bytes
コンパイル時間 14,015 ms
コンパイル使用メモリ 381,800 KB
実行使用メモリ 80,256 KB
最終ジャッジ日時 2024-07-18 12:39:58
合計ジャッジ時間 16,796 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 89 ms
76,928 KB
testcase_01 AC 86 ms
73,728 KB
testcase_02 AC 93 ms
77,568 KB
testcase_03 AC 95 ms
80,256 KB
testcase_04 AC 95 ms
80,256 KB
testcase_05 AC 1 ms
6,940 KB
testcase_06 AC 24 ms
20,992 KB
testcase_07 AC 55 ms
46,592 KB
testcase_08 AC 38 ms
32,768 KB
testcase_09 AC 28 ms
23,936 KB
testcase_10 AC 56 ms
47,872 KB
testcase_11 AC 96 ms
80,256 KB
testcase_12 AC 2 ms
6,940 KB
testcase_13 AC 15 ms
13,056 KB
testcase_14 AC 46 ms
39,040 KB
testcase_15 AC 29 ms
24,960 KB
testcase_16 AC 6 ms
6,940 KB
testcase_17 AC 18 ms
16,000 KB
testcase_18 AC 64 ms
53,888 KB
testcase_19 AC 36 ms
30,592 KB
testcase_20 AC 15 ms
13,440 KB
testcase_21 AC 8 ms
7,424 KB
testcase_22 AC 27 ms
24,448 KB
testcase_23 AC 1 ms
6,940 KB
testcase_24 AC 1 ms
6,948 KB
testcase_25 AC 1 ms
6,940 KB
testcase_26 AC 21 ms
19,200 KB
testcase_27 AC 4 ms
6,944 KB
testcase_28 AC 11 ms
10,112 KB
testcase_29 AC 15 ms
12,800 KB
testcase_30 AC 77 ms
64,640 KB
testcase_31 AC 96 ms
80,256 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