summaryrefslogtreecommitdiffstats
path: root/src/graph.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-16 05:07:14 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-16 05:07:35 -0500
commitadd7534a2230149800a836a6a848f2143a5a5e2f (patch)
treedcfdaf522c3c48382809bd6140270babda70d341 /src/graph.rs
parenteca808cb69487807f1465a9dfeebcdf4dfab8dca (diff)
downloadadvent-of-code-add7534a2230149800a836a6a848f2143a5a5e2f.tar.gz
advent-of-code-add7534a2230149800a836a6a848f2143a5a5e2f.zip
day 16
Diffstat (limited to 'src/graph.rs')
-rw-r--r--src/graph.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/graph.rs b/src/graph.rs
index 9312e7c..f8fbf3c 100644
--- a/src/graph.rs
+++ b/src/graph.rs
@@ -9,6 +9,36 @@ where
fn edges(&self, v: Vertex) -> Self::Edges;
fn edge(&self, v: Vertex, e: Edge) -> (Vertex, u64);
+ fn dijkstra_full(&self, start: Vertex) -> HashMap<Vertex, (Vertex, u64)> {
+ let mut to_visit = priority_queue::PriorityQueue::new();
+ let mut prev = HashMap::new();
+ prev.insert(start, (start, 0));
+ to_visit.push(start, std::cmp::Reverse(0));
+ while let Some((v, std::cmp::Reverse(distance))) = to_visit.pop() {
+ for e in self.edges(v) {
+ let (next, weight) = self.edge(v, e);
+ let visited = prev.contains_key(&next);
+ let new_distance = distance + weight;
+ if to_visit.get(&next).is_some() {
+ prev.insert(next, (v, new_distance));
+ if new_distance < to_visit.get_priority(&next).unwrap().0
+ {
+ to_visit.change_priority(
+ &next,
+ std::cmp::Reverse(new_distance),
+ );
+ }
+ } else {
+ if !visited {
+ prev.insert(next, (v, new_distance));
+ to_visit.push(next, std::cmp::Reverse(new_distance));
+ }
+ }
+ }
+ }
+ prev
+ }
+
fn dijkstra<F: Fn(Vertex) -> bool>(
&self,
start: Vertex,