Files
CodeObject/storage/zeta/rs/completed/2887.rs

104 lines
2.8 KiB
Rust

use std::io::{stdin, BufRead};
fn planets_find(mut parents: &Vec<usize>, i: usize) -> usize {
let mut node = parents[i];
while node != parents[node] {
node = parents[node];
}
node
}
fn planets_union(parents: &mut Vec<usize>, i: usize, j: usize) -> bool {
let ir = planets_find(parents, i);
let jr = planets_find(parents, j);
if ir == jr {
return false;
}
if ir < jr {
parents[jr] = ir;
} else {
parents[ir] = jr;
}
true
}
fn get_minimum_cost_planet_tunnel(v: &Vec<(i32, i32, i32)>) -> usize {
let mut x_axis_find_base = v
.clone()
.into_iter()
.enumerate()
.map(|(i, x)| (x.0, i))
.collect::<Vec<(i32, usize)>>();
let mut y_axis_find_base = v
.clone()
.into_iter()
.enumerate()
.map(|(i, x)| (x.1, i))
.collect::<Vec<(i32, usize)>>();
let mut z_axis_find_base = v
.clone()
.into_iter()
.enumerate()
.map(|(i, x)| (x.2, i))
.collect::<Vec<(i32, usize)>>();
x_axis_find_base.sort();
y_axis_find_base.sort();
z_axis_find_base.sort();
let mut parents = (0..v.len()).map(|i| i).collect::<Vec<usize>>();
let mut candidate_edges: Vec<(usize, (usize, usize))> = Vec::new();
for i in 0..v.len() - 1 {
let ahead = x_axis_find_base[i + 1];
let now = x_axis_find_base[i];
candidate_edges.push(((ahead.0 - now.0) as usize, (now.1, ahead.1)));
}
for i in 0..v.len() - 1 {
let ahead = y_axis_find_base[i + 1];
let now = y_axis_find_base[i];
candidate_edges.push(((ahead.0 - now.0) as usize, (now.1, ahead.1)));
}
for i in 0..v.len() - 1 {
let ahead = z_axis_find_base[i + 1];
let now = z_axis_find_base[i];
candidate_edges.push(((ahead.0 - now.0) as usize, (now.1, ahead.1)));
}
candidate_edges.sort();
let mut total_cost = 0;
for (cost, (i, j)) in candidate_edges {
if planets_union(&mut parents, i, j) {
total_cost += cost;
}
}
total_cost
}
fn main() {
let mut line = String::new();
stdin().read_line(&mut line).unwrap();
let n = line.trim_end().parse::<usize>().unwrap();
line.clear();
let v: Vec<(i32, i32, i32)> = (0..n)
.map(|_| {
stdin().read_line(&mut line).unwrap();
let mut iter = line.split_ascii_whitespace();
let t: (i32, i32, i32) = (
iter.next().unwrap().parse().unwrap(),
iter.next().unwrap().parse().unwrap(),
iter.next().unwrap().parse().unwrap(),
);
line.clear();
t
})
.collect();
println!("{}", get_minimum_cost_planet_tunnel(&v));
}