finding optimal path algorithm