Module d
Expand description
ยงABC 362 D - Shortest Path 3
refs: https://atcoder.jp/contests/abc362/tasks/abc362_d
use std::cmp::Reverse;
use std::collections::HashMap;
use proconio::input;
fn main() {
input! {
n: usize, m: usize,
a: [usize; n],
edge: [(usize, usize, usize); m],
}
let mut edge_map = HashMap::new();
for (u, v, w) in edge {
let u = u - 1;
let v = v - 1;
edge_map.entry(u).or_insert(vec![]).push((v, w + a[v]));
edge_map.entry(v).or_insert(vec![]).push((u, w + a[u]));
}
let mut ans = vec![usize::MAX; n];
let mut used = vec![false; n];
let mut pq = std::collections::BinaryHeap::new();
for (v, w) in &edge_map[&0] {
pq.push(Reverse((*w, *v)));
}
while !pq.is_empty() {
let Reverse((w, v)) = pq.pop().expect("pq should not be empty");
if used[v] {
continue;
}
used[v] = true;
ans[v] = w;
for (u, dw) in &edge_map[&v] {
if !used[*u] {
pq.push(Reverse((w + dw, *u)));
}
}
}
println!(
"{}",
ans.iter()
.skip(1)
.map(|&x| (x + a[0]).to_string())
.collect::<Vec<_>>()
.join(" ")
);
}