結果
| 問題 |
No.417 チューリップバブル
|
| ユーザー |
fukafukatani
|
| 提出日時 | 2018-11-05 22:25:48 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 43 ms / 2,000 ms |
| コード長 | 2,812 bytes |
| コンパイル時間 | 13,336 ms |
| コンパイル使用メモリ | 405,252 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-20 20:19:19 |
| 合計ジャッジ時間 | 15,414 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
use std::collections::*;
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 read_vec<T: std::str::FromStr>() -> Vec<T> {
read::<String>().split_whitespace()
.map(|e| e.parse().ok().unwrap()).collect()
}
fn make_tree(cur_idx: usize, parent_idx: usize, edges: &Vec<Vec<usize>>,
tree: &mut Vec<Vec<usize>>) {
for child_idx in edges[cur_idx].iter() {
if *child_idx == parent_idx {
continue;
}
tree[cur_idx].push(*child_idx);
make_tree(*child_idx, cur_idx, edges, tree);
}
}
fn topological_dfs(cur_idx: usize, tree: &Vec<Vec<usize>>, result: &mut Vec<usize>) {
for child_idx in tree[cur_idx].iter() {
result.push(*child_idx);
topological_dfs(*child_idx, tree, result);
}
}
fn main() {
let v: Vec<usize> = read_vec();
let (n, m) = (v[0], v[1]);
let mut taxes = vec![0i32; n];
for i in 0..n {
taxes[i] = read();
}
// println!("taxes {:?}", taxes);
let mut edges: Vec<Vec<usize>> = vec![Vec::new(); n];
let mut time_dict: HashMap<(usize, usize), usize> = HashMap::new();
for _ in 0..n - 1 {
let v: Vec<usize> = read_vec();
let (a, b, c) = (v[0], v[1], v[2]);
edges[a].push(b);
edges[b].push(a);
time_dict.insert((a, b), c);
time_dict.insert((b, a), c);
}
// println!("edges {:?}", edges);
let mut tree: Vec<Vec<usize>> = vec![Vec::new(); n];
make_tree(0, n, &edges, &mut tree);
// println!("tree {:?}", tree);
let mut topological_sorted_indexes = vec![0];
topological_dfs(0, &tree, &mut topological_sorted_indexes);
// println!("t sorted {:?}", topological_sorted_indexes);
let mut dp = vec![vec![-1; n]; m + 1];
for ti in topological_sorted_indexes.iter().rev() {
let ti = *ti;
dp[0][ti] = taxes[ti];
for ci in tree[ti].iter() {
let ci = *ci;
let new_time: usize = 2 * time_dict[&(ti, ci)];
for mti in (0..m + 1).rev() {
if dp[mti][ti] == -1 {
continue
}
if m + 1 <= new_time + mti {
continue;
}
for mci in (0..m + 1 - new_time - mti).rev() {
if dp[mci][ci] == -1 {
continue
}
dp[mti + mci + new_time][ti] = std::cmp::max(dp[mti + mci + new_time][ti],
dp[mti][ti] + dp[mci][ci]);
}
}
}
}
// println!("{:?}", dp);
let mut ans = 0;
for mi in 0..m + 1 {
ans = std::cmp::max(ans, dp[mi][0]);
}
println!("{:?}", ans);
}
fukafukatani