diff --git a/README.md b/README.md index c3b9afae..a371a10b 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ In order to achieve greater coverage and encourage more people to contribute to - + diff --git a/src/cpp/Dijkstras_MinHeap.cpp b/src/cpp/Dijkstras_MinHeap.cpp new file mode 100644 index 00000000..179db585 --- /dev/null +++ b/src/cpp/Dijkstras_MinHeap.cpp @@ -0,0 +1,100 @@ +/** + * Dijkstras_MinHeap.cpp + * + * This file implements Dijkstra's algorithm using a min-heap (priority queue). + * The algorithm finds the shortest paths from the source vertex to all other vertices in a weighted graph. + * + * Functions: + * - void dijkstra(const unordered_map>& graph, int start_vertex) + * - graph: An adjacency list representation of the graph. + * - key: vertex + * - value: unordered_map of connected vertices and their edge weights + * - start_vertex: The starting vertex for Dijkstra's algorithm. + * + * Example Usage: + * Uncomment the main function to run a sample test case. + * The sample graph used in the main function is represented as an adjacency list. + */ + +#include +#include +#include +#include +#include + +using namespace std; + +// A structure to represent a node in the priority queue +struct Node { + int vertex; + int distance; + bool operator>(const Node& other) const { + return distance > other.distance; + } +}; + +void dijkstra(const unordered_map>& graph, int start_vertex) { + // Initialize distances and predecessors + unordered_map dist; + unordered_map pred; + for (const auto& pair : graph) { + dist[pair.first] = numeric_limits::max(); + pred[pair.first] = -1; + } + dist[start_vertex] = 0; + + // Priority queue to store vertices and their distances + priority_queue, greater> priority_queue; + priority_queue.push({ start_vertex, 0 }); + + while (!priority_queue.empty()) { + Node current = priority_queue.top(); + priority_queue.pop(); + + // If this distance is not updated, continue + if (current.distance > dist[current.vertex]) { + continue; + } + + // Visit each neighbor of the current vertex + for (const auto& neighbor_pair : graph.at(current.vertex)) { + int neighbor = neighbor_pair.first; + int weight = neighbor_pair.second; + int distance = current.distance + weight; + + // If a shorter path to the neighbor is found + if (distance < dist[neighbor]) { + dist[neighbor] = distance; + pred[neighbor] = current.vertex; + priority_queue.push({ neighbor, distance }); + } + } + } + + // Print distances and predecessors + cout << "Distances: \n"; + for (const auto& pair : dist) { + cout << "Vertex " << pair.first << ": " << pair.second << endl; + } + cout << "\nPredecessors: \n"; + for (const auto& pair : pred) { + cout << "Vertex " << pair.first << ": " << pair.second << endl; + } +} + +// Uncomment the following main function to run a sample test case + +int main() { + // Example graph represented as an adjacency list + unordered_map> graph = { + {0, {{1, 1}, {2, 4}}}, + {1, {{0, 1}, {2, 2}, {3, 5}}}, + {2, {{0, 4}, {1, 2}, {3, 1}}}, + {3, {{1, 5}, {2, 1}}} + }; + + // Running Dijkstra's algorithm from vertex 0 + dijkstra(graph, 0); + + return 0; +}