def shortest_paths_to_source(graph, source) distance_to_source_for = {} prev_node_for = {} distance_to_source_for[source] = 0 pq = PriorityQueue.new graph.nodes.each do |node| if node != source distance_to_source_for[node] = +1.00/0.00 #infinity prev_node_for[node] = nil end pq.add_with_priority(node, distance_to_source_for[node]) end while !(pq.is_empty?) current_node = pq.pop #lowest priority node current_node.adjacent_nodes.each do |adjacent_node| distance = distance_to_source_for[current_node] + distance_between(current_node, adjacent_node) if distance < distance_to_source_for[adjacent_node] distance_to_source_for[adjacent_node] = distance prev_node_for[adjacent_node] = current_node pq.decrease_priority(adjacent_node, distance_to_source_for[adjacent_node]) end end end [distance_to_source_for, prev_node_for] end
We use cookies to provide and improve our services. By using our site, you consent to our Cookies Policy. Accept Learn more