Which algorithm is used to find the shortest path from a single source to all other vertices in a graph with non-negative edge weights?