function dijkstra(n, graph, source, destination) {
const distance = new Array(n).fill(Infinity);
const visited = new Array(n);
const parents = [];
distance[source] = 0;
parents[source] = -1;
const priorityQueue = [source];
outerLoop: while (priorityQueue.length > 0) {
const currentNode = getSmallestNodeByDistance(priorityQueue, distance);
visited[currentNode] = true;
for (const node of graph[currentNode]) {
if (visited[node.vertex]) {
continue;
}
const newDistance = distance[currentNode] + node.weight;
if (distance[node.vertex] > newDistance) {
distance[node.vertex] = newDistance;
priorityQueue.push(node.vertex);
parents[node.vertex] = currentNode;
}
if (currentNode === destination) {
break outerLoop;
}
}
}
return {
distance: distance[destination],
path: generatePath(destination, parents)
};
}