Skip to content

Commit 343a072

Browse files
dijk test bfs (#35)
* dijk test bfs * fix
1 parent ec0794d commit 343a072

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

examples/graphs/dijk_yosupo.rs

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

20-
fn dfs(
21-
adj: &[Vec<(usize, u64)>],
22-
dist: &[u64],
23-
u: usize,
24-
path: &mut Vec<usize>,
25-
seen: &mut [bool],
26-
t: usize,
27-
) {
28-
if seen[u] {
29-
return;
30-
}
31-
seen[u] = true;
32-
path.push(u);
33-
if u == t {
34-
println!("{} {}", dist[u], path.len() - 1);
35-
for i in 0..path.len() - 1 {
36-
println!("{} {}", path[i], path[i + 1]);
37-
}
38-
std::process::exit(0);
39-
}
20+
let dist = dijk(&adj, s);
21+
22+
if dist[t] == u64::MAX {
23+
println!("{}", -1);
24+
return;
25+
}
26+
27+
let mut par = vec![0; n];
28+
par[s] = s;
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() {
4034
for &(v, w) in &adj[u] {
41-
if dist[u] + w == dist[v] {
42-
dfs(adj, dist, v, path, seen, t);
35+
if seen[v] || dist[u] + w != dist[v] {
36+
continue;
4337
}
38+
par[v] = u;
39+
seen[v] = true;
40+
q.push_back(v);
4441
}
45-
path.pop();
4642
}
4743

48-
let dist = dijk(&adj, s);
4944
let mut path = vec![];
50-
let mut seen = vec![false; n];
51-
dfs(&adj, &dist, s, &mut path, &mut seen, t);
45+
let mut u = t;
46+
while u != s {
47+
path.push(u);
48+
u = par[u];
49+
}
50+
path.push(s);
5251

53-
println!("{}", -1);
52+
path.reverse();
53+
54+
println!("{} {}", dist[t], path.len() - 1);
55+
for it in 0..path.len() - 1 {
56+
println!("{} {}", path[it], path[it + 1]);
57+
}
5458
}

0 commit comments

Comments
 (0)