結果
問題 | No.17 2つの地点に泊まりたい |
ユーザー |
|
提出日時 | 2019-12-15 22:19:40 |
言語 | Rust (1.83.0 + proconio) |
結果 |
AC
|
実行時間 | 90 ms / 5,000 ms |
コード長 | 2,053 bytes |
コンパイル時間 | 13,773 ms |
コンパイル使用メモリ | 379,416 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-07-02 18:23:59 |
合計ジャッジ時間 | 15,829 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 27 |
ソースコード
use std::cmp::min;use std::io::Read;const INF: i64 = 1000000000;fn dijkstra(start: usize, end: usize, graph: &Vec<Vec<(usize, i64)>>) -> i64 {let mut dist = vec![INF; graph.len()];dist[start] = 0;let mut bh = std::collections::BinaryHeap::new();// (startからその頂点に辿り着くコスト, 頂点番号)を優先度付きキューで管理// BinaryHeapは最大値を返すので、最小コストを得るためにコストは負の数で管理する。bh.push((0i64, start));while let Some((cost, v)) = bh.pop() {if dist[v] < -cost {continue;}for e in graph[v].iter() {let nv = e.0;let nc = e.1;if dist[nv] > -cost + nc {dist[nv] = -cost + nc;bh.push((-dist[nv], nv));}}}dist[end]}fn main() {let mut s: String = String::new();std::io::stdin().read_to_string(&mut s).ok();let mut itr = s.trim().split_whitespace();let n: usize = itr.next().unwrap().parse().unwrap();let s: Vec<i64> = (0..n).map(|_| itr.next().unwrap().parse().unwrap()).collect();let m: usize = itr.next().unwrap().parse().unwrap();let mut graph: Vec<Vec<(usize, i64)>> = vec![Vec::new(); n];for _ in 0..m {let a: usize = itr.next().unwrap().parse().unwrap();let b: usize = itr.next().unwrap().parse().unwrap();let c: i64 = itr.next().unwrap().parse().unwrap();graph[a].push((b, c));graph[b].push((a, c));}let mut ans: i64 = INF;// どの2地点に止まるか。for i in 1..n - 1 {for j in 1..n - 1 {if i == j {continue;}ans = min(ans,dijkstra(0, i, &graph)+ dijkstra(i, j, &graph)+ dijkstra(j, n - 1, &graph)+ s[i]+ s[j],);}}println!("{}", ans);}