complete 2533.rs
This commit is contained in:
102
storage/zeta/rs/completed/2533.rs
Normal file
102
storage/zeta/rs/completed/2533.rs
Normal file
@@ -0,0 +1,102 @@
|
||||
use std::{io::stdin, usize};
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||
enum Color {
|
||||
White,
|
||||
Black,
|
||||
Undetermined,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct ColorRecord {
|
||||
color: Color,
|
||||
cnt_white: usize,
|
||||
cnt_black: usize,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut line = String::new();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let n: usize = line.trim().parse().unwrap();
|
||||
|
||||
let mut tree: Vec<Vec<usize>> = vec![vec![]; n];
|
||||
|
||||
let _ = (0..(n - 1)).for_each(|_| {
|
||||
line.clear();
|
||||
stdin().read_line(&mut line).unwrap();
|
||||
let mut iter = line.split_ascii_whitespace();
|
||||
let (u, v) = (
|
||||
iter.next().unwrap().parse::<usize>().unwrap() - 1,
|
||||
iter.next().unwrap().parse::<usize>().unwrap() - 1,
|
||||
);
|
||||
|
||||
tree[u].push(v);
|
||||
tree[v].push(u);
|
||||
});
|
||||
|
||||
println!("{}", minimum_early_adapters(n, &tree));
|
||||
}
|
||||
|
||||
enum StackInst {
|
||||
ParseLower { parent: usize, current: usize },
|
||||
UpdateCurrent { parent: usize, current: usize },
|
||||
}
|
||||
|
||||
fn minimum_early_adapters(n: usize, tree: &Vec<Vec<usize>>) -> usize {
|
||||
let mut records: Vec<ColorRecord> = vec![
|
||||
ColorRecord {
|
||||
color: Color::Undetermined,
|
||||
cnt_white: 0,
|
||||
cnt_black: 0
|
||||
};
|
||||
n
|
||||
];
|
||||
|
||||
let mut deque: Vec<StackInst> = vec![]; //
|
||||
deque.push(StackInst::ParseLower {
|
||||
parent: usize::MAX,
|
||||
current: 0,
|
||||
});
|
||||
while !deque.is_empty() {
|
||||
let inst = deque.pop().unwrap();
|
||||
|
||||
match inst {
|
||||
StackInst::ParseLower { parent, current } => {
|
||||
deque.push(StackInst::UpdateCurrent { parent, current });
|
||||
for &v in tree[current].iter() {
|
||||
if v != parent {
|
||||
deque.push(StackInst::ParseLower {
|
||||
parent: current,
|
||||
current: v,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
StackInst::UpdateCurrent { parent, current } => {
|
||||
let mut is_white = true;
|
||||
let mut cnt_black: usize = 0;
|
||||
let mut cnt_white: usize = 0;
|
||||
for &v in tree[current].iter() {
|
||||
if v != parent {
|
||||
cnt_black += records[v].cnt_black;
|
||||
cnt_white += records[v].cnt_white;
|
||||
if records[v].color == Color::White {
|
||||
is_white = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
let record = records.get_mut(current).unwrap();
|
||||
record.cnt_black = cnt_black;
|
||||
record.cnt_white = cnt_white;
|
||||
if is_white {
|
||||
record.color = Color::White;
|
||||
record.cnt_white += 1;
|
||||
} else {
|
||||
record.color = Color::Black;
|
||||
record.cnt_black += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
records[0].cnt_black
|
||||
}
|
||||
Reference in New Issue
Block a user