Skip to content

Commit d455276

Browse files
authored
remove par (#101)
* remove par * fix --------- Co-authored-by: Luke Videckis <[email protected]>
1 parent 7670e46 commit d455276

File tree

3 files changed

+30
-25
lines changed

3 files changed

+30
-25
lines changed

examples/graphs/dijk_aizu.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ fn main() {
1616
adj[u].push((v, w));
1717
}
1818

19-
let (dist, par) = dijk(&adj, s);
20-
21-
assert_eq!(par[s], None);
19+
let dist = dijk(&adj, s);
2220

2321
for d in dist {
2422
if d == u64::MAX {

examples/graphs/dijk_yosupo.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,35 @@ fn main() {
1717
adj[u].push((v, w));
1818
}
1919

20-
let (dist, par) = dijk(&adj, s);
21-
22-
assert_eq!(par[s], None);
20+
let dist = dijk(&adj, s);
2321

2422
if dist[t] == u64::MAX {
2523
println!("{}", -1);
2624
return;
2725
}
2826

29-
let mut path = vec![];
27+
let mut par = vec![None; n];
28+
{
29+
let mut seen = vec![false; n];
30+
seen[s] = true;
31+
let mut q = std::collections::VecDeque::new();
32+
q.push_back(s);
33+
while let Some(u) = q.pop_front() {
34+
for &(v, w) in &adj[u] {
35+
if seen[v] || dist[u] + w != dist[v] {
36+
continue;
37+
}
38+
par[v] = Some(u);
39+
seen[v] = true;
40+
q.push_back(v);
41+
}
42+
}
43+
}
44+
let mut path = vec![t];
3045
let mut u = t;
31-
path.push(u);
32-
while let Some(prev_u) = par[u] {
33-
path.push(prev_u);
34-
u = prev_u;
46+
while let Some(v) = par[u] {
47+
u = v;
48+
path.push(u);
3549
}
3650

3751
path.reverse();

src/graphs/dijk.rs

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,29 @@
99
/// adj[u].push((v, w));
1010
/// }
1111
///
12-
/// let (dist, par) = dijk(&adj, 0);
12+
/// let dist = dijk(&adj, 0);
1313
/// 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-
/// }
2014
/// ```
2115
///
2216
/// # Complexity
2317
/// - V: number of vertices
2418
/// - E: number of edges
2519
/// - Time: O(V + E log E)
2620
/// - 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> {
2822
use std::cmp::Reverse;
2923
let n = adj.len();
3024
let mut dist = vec![u64::MAX; n];
31-
let mut par = vec![None; n];
3225
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() {
3528
if dist[u] <= d {
3629
continue;
3730
}
38-
(dist[u], par[u]) = (d, p);
31+
dist[u] = d;
3932
for &(v, w) in &adj[u] {
40-
q.push(Reverse((dist[u] + w, v, Some(u))));
33+
q.push(Reverse((dist[u] + w, v)));
4134
}
4235
}
43-
(dist, par)
36+
dist
4437
}

0 commit comments

Comments
 (0)