From 897bab12bf05fb0bbe51fb151fa7b9ef38840e32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Wed, 14 May 2025 20:53:39 +0200 Subject: [PATCH] Change Dijkstra's algorithm to return all shortest distances --- include/aoc/common/WeightedEdgeGraph.hpp | 2 +- src/common/WeightedEdgeGraph.cpp | 21 +++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/include/aoc/common/WeightedEdgeGraph.hpp b/include/aoc/common/WeightedEdgeGraph.hpp index be1c0bd..2c7961d 100644 --- a/include/aoc/common/WeightedEdgeGraph.hpp +++ b/include/aoc/common/WeightedEdgeGraph.hpp @@ -28,7 +28,7 @@ class WeightedEdgeGraph void addEdge(const int vertex1, const int vertex2, const int weight); int getVertexWeight(const int vertex) const; int getEdgeWeight(const int edge) const; - int dijkstra(const int source, const int target) const; + std::vector dijkstra(const int source) const; struct Incidence { diff --git a/src/common/WeightedEdgeGraph.cpp b/src/common/WeightedEdgeGraph.cpp index 474704a..9f29fe0 100644 --- a/src/common/WeightedEdgeGraph.cpp +++ b/src/common/WeightedEdgeGraph.cpp @@ -49,7 +49,7 @@ int WeightedEdgeGraph::getEdgeWeight(const int edge) const return edgeWeights_[edge]; } -int WeightedEdgeGraph::dijkstra(const int source, const int target) const +std::vector WeightedEdgeGraph::dijkstra(const int source) const { std::vector distances(firstVertexIncidences_.size(), std::numeric_limits::max()); auto compare = [&distances](int left, int right) { return distances[left] > distances[right]; }; @@ -63,25 +63,18 @@ int WeightedEdgeGraph::dijkstra(const int source, const int target) const int v{ queue.top() }; queue.pop(); - int incidence{ firstVertexIncidences_[v] }; - while (incidence > -1) + for (auto neighbor = begin(v); neighbor != end(); ++neighbor) { - int neighbor{ vertexEdgeIncidences_[incidence].vertex }; - int newDistance{ distances[v] + edgeWeights_[incidence >> 1] }; - if (distances[neighbor] > newDistance) + int newDistance{ distances[v] + edgeWeights_[neighbor->edge] }; + if (distances[neighbor->vertex] > newDistance) { - distances[neighbor] = newDistance; - queue.push(neighbor); + distances[neighbor->vertex] = newDistance; + queue.push(neighbor->vertex); } - if (neighbor == target) - { - return distances[target]; - } - incidence = vertexEdgeIncidences_[incidence].next; } } - return -1; + return distances; } WeightedEdgeGraph::NeighborIterator WeightedEdgeGraph::begin(const int vertex) const