|
9 | 9 | /// adj[u].push((v, w)); |
10 | 10 | /// } |
11 | 11 | /// |
12 | | -/// let (dist, par) = dijk(&adj, 0); |
| 12 | +/// let dist = dijk(&adj, 0); |
13 | 13 | /// assert_eq!(dist, [0, 10, 110, u64::MAX]); |
14 | | -/// assert_eq!(par, [None, Some(0), Some(1), None]); |
15 | | -/// |
16 | | -/// let mut u = 2; // loop over shortest path in reverse |
17 | | -/// while let Some(prev) = par[u] { |
18 | | -/// u = prev; |
19 | | -/// } |
20 | 14 | /// ``` |
21 | 15 | /// |
22 | 16 | /// # Complexity |
23 | 17 | /// - V: number of vertices |
24 | 18 | /// - E: number of edges |
25 | 19 | /// - Time: O(V + E log E) |
26 | 20 | /// - Space: O(V + E) |
27 | | -pub fn dijk(adj: &[Vec<(usize, u64)>], s: usize) -> (Vec<u64>, Vec<Option<usize>>) { |
| 21 | +pub fn dijk(adj: &[Vec<(usize, u64)>], s: usize) -> Vec<u64> { |
28 | 22 | use std::cmp::Reverse; |
29 | 23 | let n = adj.len(); |
30 | 24 | let mut dist = vec![u64::MAX; n]; |
31 | | - let mut par = vec![None; n]; |
32 | 25 | let mut q = std::collections::BinaryHeap::new(); |
33 | | - q.push(Reverse((0, s, None))); |
34 | | - while let Some(Reverse((d, u, p))) = q.pop() { |
| 26 | + q.push(Reverse((0, s))); |
| 27 | + while let Some(Reverse((d, u))) = q.pop() { |
35 | 28 | if dist[u] <= d { |
36 | 29 | continue; |
37 | 30 | } |
38 | | - (dist[u], par[u]) = (d, p); |
| 31 | + dist[u] = d; |
39 | 32 | for &(v, w) in &adj[u] { |
40 | | - q.push(Reverse((dist[u] + w, v, Some(u)))); |
| 33 | + q.push(Reverse((dist[u] + w, v))); |
41 | 34 | } |
42 | 35 | } |
43 | | - (dist, par) |
| 36 | + dist |
44 | 37 | } |
0 commit comments