Pagini recente » Monitorul de evaluare | Cod sursa (job #1767567) | Cod sursa (job #2346701) | Cod sursa (job #139952) | Cod sursa (job #3340845)
use std::io::{BufWriter, Write};
use std::fs::{File,self};
use std::collections::BinaryHeap;
macro_rules! parse_line {
($iter: expr, $($t: ty),+) => {{
let line=$iter.next().unwrap();
let mut parts = line.split_whitespace();
($(parts.next().unwrap().parse::<$t>().unwrap()), +)
}};
}
fn main() -> std::io::Result<()> {
let content = fs::read_to_string("dijkstra.in")?;
let mut lines = content.lines();
let mut writer = BufWriter::new(File::create("dijkstra.out")?);
let (n, m) =parse_line!(lines, usize, usize);
let mut adj: Vec<Vec<(u32, i32)>> = vec![vec![]; n+1];
let mut dist: Vec<i32> = vec![i32::MAX; n+1];
let mut viz: Vec<i32> = vec![0; n+1];
dist[1] = 0;
for _ in 0..m {
let (x, y, c) = parse_line!(lines, usize, u32, i32);
adj[x].push((y, c));
}
let mut pq = BinaryHeap::new();
pq.push((0,1));
while let Some((_, node)) = pq.pop() {
if viz[node] == 1 {
continue;
}
viz[node] = 1;
for &(vec, cost) in &adj[node] {
if dist[vec as usize] > dist[node] + cost {
dist[vec as usize ] = dist[node] + cost;
if viz[vec as usize] == 0 {
pq.push((-dist[vec as usize], vec as usize));
}
}
}
}
for &item in dist.iter().skip(2) {
if item == i32::MAX {
write!(writer,"0 ",)?;
}
else {
write!(writer,"{} ",item)?;
}
}
Ok(())
}