struct DFS { g: Vec>, check: Vec, ans: Vec, } impl DFS { fn new(n: usize) -> DFS { DFS { g: vec![vec![]; n], check: vec![false; n], ans: vec![0; n], } } fn search(&mut self, from: usize) -> usize { self.check[from] = true; let mut sum = 0; for &to in self.g[from].clone().iter() { if self.check[to] { continue; } let res = self.search(to); self.ans[from] += sum * res; sum += res; } self.ans[from] *= 2; self.ans[from] += sum * 2 + 1; sum + 1 } } fn main() { let n: usize = { let mut buf = String::new(); std::io::stdin().read_line(&mut buf).unwrap(); buf.trim_end().parse().unwrap() }; let mut dfs = DFS::new(n); for _ in 0..(n - 1) { let (v, w): (usize, usize) = { let mut buf = String::new(); std::io::stdin().read_line(&mut buf).unwrap(); let mut iter = buf.split_whitespace(); ( iter.next().unwrap().parse::().unwrap() - 1, iter.next().unwrap().parse::().unwrap() - 1, ) }; dfs.g[v].push(w); dfs.g[w].push(v); } dfs.search(0); for i in 0..n { println!("{}", dfs.ans[i]); } }