Is there an algorithm for finding the shortest path in an undirected weighted graph?