Skip to content

Commit c959166

Browse files
committed
remove par
1 parent 7670e46 commit c959166

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
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: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,20 @@
2424
/// - E: number of edges
2525
/// - Time: O(V + E log E)
2626
/// - Space: O(V + E)
27-
pub fn dijk(adj: &[Vec<(usize, u64)>], s: usize) -> (Vec<u64>, Vec<Option<usize>>) {
27+
pub fn dijk(adj: &[Vec<(usize, u64)>], s: usize) -> Vec<u64> {
2828
use std::cmp::Reverse;
2929
let n = adj.len();
3030
let mut dist = vec![u64::MAX; n];
31-
let mut par = vec![None; n];
3231
let mut q = std::collections::BinaryHeap::new();
33-
q.push(Reverse((0, s, None)));
34-
while let Some(Reverse((d, u, p))) = q.pop() {
32+
q.push(Reverse((0, s)));
33+
while let Some(Reverse((d, u))) = q.pop() {
3534
if dist[u] <= d {
3635
continue;
3736
}
38-
(dist[u], par[u]) = (d, p);
37+
dist[u] = d;
3938
for &(v, w) in &adj[u] {
40-
q.push(Reverse((dist[u] + w, v, Some(u))));
39+
q.push(Reverse((dist[u] + w, v)));
4140
}
4241
}
43-
(dist, par)
42+
dist
4443
}

0 commit comments

Comments
 (0)