2023-06-29 休みすぎている / 各部分木の大きさ (オリジナル問題) を解いた
家庭保育で休み。 6 月は休みをとりすぎている……。
- 各部分木の大きさ (オリジナル問題)
https://atcoder.jp/contests/pastbook2022/tasks/pastbook2022_c
- https://atcoder.jp/contests/pastbook2022/submissions/43047316
- 木 DP
dp[i] := 頂点 i の部分木のサイズ
- DFS の帰りがけ順である頂点 i はその子 j の
dp[j]
の和 +1 でdp[i]
を更新していけばいい
use proconio::{input, marker::Usize1};
fn adjacency_list(n: usize, uv: &[(usize, usize)]) -> Vec<Vec<usize>> {
let mut edges = vec![vec![]; n];
for (u, v) in uv.iter().copied() {
edges[u].push(v);
edges[v].push(u);
}
edges
}
fn dfs(ans: &mut Vec<usize>, edges: &[Vec<usize>], u: usize, p: usize) {
ans[u] = 1_usize;
for v in edges[u].iter().copied() {
if v == p {
continue;
}
dfs(ans, edges, v, u);
ans[u] += ans[v];
}
}
fn main() {
input! {
n: usize,
ab: [(Usize1, Usize1); n - 1],
}
let edges = adjacency_list(n, &ab);
let mut ans = vec![0_usize; n];
dfs(&mut ans, &edges, 0, 0);
for a in ans {
println!("{}", a);
}
}
今日のコミット。