結果
問題 |
No.3111 Toll Optimization
|
ユーザー |
|
提出日時 | 2025-04-19 02:08:52 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 205 ms / 5,000 ms |
コード長 | 1,186 bytes |
コンパイル時間 | 16,054 ms |
コンパイル使用メモリ | 399,864 KB |
実行使用メモリ | 20,608 KB |
最終ジャッジ日時 | 2025-04-19 02:09:16 |
合計ジャッジ時間 | 20,066 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 70 |
ソースコード
use std::{cmp::Reverse, collections::BinaryHeap}; use proconio::{input, marker::Usize1}; const INF: i64 = 1_000_000_000_000_000_000; fn main() { input! { n: usize, m: usize, k: usize, c: [i64; m], edges: [(Usize1, Usize1); m], } let mut graph = vec![vec![]; n]; for e in 0 .. m { let (u, v) = edges[e]; let w = c[e]; graph[u].push((v, w)); graph[v].push((u, w)); } let mut dist = vec![vec![INF; n]; k + 1]; dist[k][0] = 0; let mut pq = BinaryHeap::new(); pq.push((Reverse(0), 0, k)); while let Some((Reverse(d), u, k)) = pq.pop() { if dist[k][u] < d { continue; } for &(v, w) in &graph[u] { if dist[k][v] > d + w { dist[k][v] = d + w; pq.push((Reverse(d + w), v, k)); } if k > 0 && dist[k - 1][v] > d { dist[k - 1][v] = d; pq.push((Reverse(d), v, k - 1)); } } } let mut ans = INF; for k in 0 ..= k { ans = ans.min(dist[k][n - 1]); } if ans >= INF { ans = -1; } println!("{ans}"); }