Pagini recente » Cod sursa (job #194104) | Cod sursa (job #1019642) | Cod sursa (job #2786682) | Cod sursa (job #2692560) | Cod sursa (job #2640333)
use std::collections::BinaryHeap;
use std::cmp::Reverse;
use std::fs::File;
use std::io::{BufReader, BufRead, Write};
struct Graph {
n: usize,
graph: Vec<Vec<(usize, i32)>>,
}
impl Graph {
fn new(n: usize, graph: Vec<Vec<(usize, i32)>>) -> Graph {
Graph {
n,
graph,
}
}
fn dijkstra(&mut self, root: usize) -> Vec<i32> {
let mut dist = vec![1000000000; 1 + self.n];
let mut heap = BinaryHeap::new();
dist[root] = 0;
heap.push(Reverse((dist[root], root)));
while let Some(Reverse((dist_node, node))) = heap.pop() {
if dist[node] == dist_node {
for (neighbour, cost) in &self.graph[node] {
if dist[node] + *cost < dist[*neighbour] {
dist[*neighbour] = dist[node] + *cost;
heap.push(Reverse((dist[*neighbour], *neighbour)));
}
}
}
}
dist
}
}
fn main() {
let mut fin = BufReader::new(File::open("dijkstra.in").unwrap());
let mut line = String::new();
fin.read_line(&mut line).unwrap();
let args: Vec<&str> = line.trim().split(' ').collect();
assert_eq!(args.len(), 2);
let n: usize = args[0].parse().unwrap();
let m: usize = args[1].parse().unwrap();
let mut graph: Vec<Vec<(usize, i32)>> = vec![Vec::new(); 1 + n];
for _ in 0..m {
let mut line = String::new();
fin.read_line(&mut line).unwrap();
let args: Vec<&str> = line.trim().split(' ').collect();
let (a, b, cost): (usize, usize, i32) = (
args[0].parse().unwrap(),
args[1].parse().unwrap(),
args[2].parse().unwrap(),
);
graph[a].push((b, cost));
}
let mut fout = File::create("dijkstra.out").unwrap();
let dist = Graph::new(n, graph).dijkstra(1);
for i in 2..n+1 {
fout.write(format!("{} ", if dist[i] < 1000000000 { dist[i] } else { 0 } ).as_bytes()).unwrap();
}
}