fn main() { input!{ // 町,道,店,所持金 n: usize, m: usize, p: usize, y: usize, } // 双方向リスト(行先の町,コスト) let mut uv = vec![Vec::new(); n]; for _ in 0..m { input!{ a: Usize1, b: Usize1, c : usize, } uv[a].push((b, c)); uv[b].push((a, c)); } // 店での価格 let mut shops = vec![INF; n]; for _ in 0..p { input!{ d: Usize1, e: usize, } shops[d] = e; } // 最小コストのダイクストラ let mut min_cost = vec![INF; n]; min_cost[0] = 0; let mut hp = BinaryHeap::new(); // 最小コスト金額と位置 hp.push(Reverse((0, 0))); while hp.len() > 0 { let (cost_yen, cpos) = hp.pop().unwrap().0; if min_cost[cpos] < cost_yen { continue; } for &(npos, cost) in &uv[cpos] { let ncost_yen = min_cost[cpos] + cost; if min_cost[npos] > ncost_yen { min_cost[npos] = ncost_yen; hp.push(Reverse((ncost_yen, npos))); } } } let mut ans = 0; for i in 0..n { ans = max(ans, (y - min_cost[i]) / shops[i]); } println!("{}", ans); } // const MOD17: usize = 1000000007; // const MOD93: usize = 998244353; const INF: usize = 1 << 60; // let dx = vec![!0, 0, 1, 0]; // 上左下右 // let dy = vec![0, !0, 0, 1]; // 上左下右 // let d = vec!{(!0, 0), (0, !0), (1, 0), (0, 1)}; // 上左下右 #[allow(unused)] use proconio::{input, marker::Chars, marker::Usize1}; #[allow(unused)] use std::{ mem::swap, cmp::min, cmp::max, cmp::Reverse, collections::HashSet, collections::BTreeSet, collections::HashMap, collections::BTreeMap, collections::BinaryHeap, collections::VecDeque, iter::FromIterator, };