function dijkstra(graph, start):

   distance = {v: infinity for v in graph}
   distance[start] = 0
   waiting = priority_queue(start)
   while waiting is not empty:
      current = remove_nearest(waiting)
      for road from current:

        proposed = distance[current] + road.cost
        if proposed < distance[road.destination]:
           distance[road.destination] = proposed
           remember current as the predecessor
   return distance
