use proconio::{input, marker::Usize1}; use std::cmp::{Reverse, min}; use std::collections::BinaryHeap; // https://maguro.dev/blog/debug-macro/ #[allow(unused_macros)] macro_rules! debug { ($($a:expr),* $(,)*) => { #[cfg(debug_assertions)] eprintln!(concat!($("| ", stringify!($a), " = {:?} "),*, "|"), $(&$a),*); }; } fn main() { input! { n: usize, m: usize, std: [(Usize1, Usize1, usize); m] } let mut graph = vec![vec![]; n]; for (s, t, d) in std { graph[s].push((t, d)); graph[t].push((s, d)); } // weight[i] := 都市 i に到達可能な体重の最大値 let mut weight = vec![0; n]; weight[0] = usize::MAX; let mut pq = BinaryHeap::new(); pq.push((weight[0], 0)); while let Some((w, u)) = pq.pop() { if w < weight[u] { continue; } for &(v, d) in &graph[u] { let nw = min(d, w); if weight[v] < nw { weight[v] = nw; pq.push((nw, v)); } } } let mw = weight[n - 1]; let mut dist = vec![usize::MAX; n]; dist[0] = 0; let mut pq = BinaryHeap::new(); pq.push((Reverse(0), 0)); while let Some((Reverse(cst), u)) = pq.pop() { if dist[u] < cst { continue; } for &(v, d) in &graph[u] { if d < mw { continue; } let ncst = cst + 1; if ncst < dist[v] { dist[v] = ncst; pq.push((Reverse(ncst), v)); } } } println!("{} {}", mw, dist[n - 1]); }