Shortest path from start -> end using Dijkstra's Algorithm
// Dijkstra's algorithm to find the shortest path
int dijkstra(int start, int end) {
int n = adjacencyList.size();
vector<int> distances(n, INT_MAX);
distances[start] = 0;
// Priority queue to efficiently retrieve the node with the minimum distance
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,int>>> priorityQueue;
priorityQueue.push({0, start});
while (!priorityQueue.empty()) {
int currentNode = priorityQueue.top().second;
int currentCost = priorityQueue.top().first;
priorityQueue.pop();
// Skip if a shorter path has already been found
if (currentCost > distances[currentNode])
continue;
// If found the target node then return the cost
if(currentNode == end)
return currentCost ;
// Explore neighbors and update distances
for (auto edge : adjacencyList[currentNode]) {
int neighbor = edge.first, edgeLength = edge.second;
int newRouteCost = edgeLength + distances[currentNode];
// Update distance if a shorter route is found
if (distances[neighbor] > newRouteCost) {
distances[neighbor] = newRouteCost;
priorityQueue.push({newRouteCost, neighbor});
}
}
}
// Return the minimum distance or -1 if no path exists
return ((distances[end] == INT_MAX) ? -1 : distances[end]);
}