27 lines
830 B
Ruby
27 lines
830 B
Ruby
|
# Will find the shortest path between a source node and any other node in the graph.
|
||
|
# https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Using_a_priority_queue
|
||
|
|
||
|
def dijkstra(graph, source_node)
|
||
|
priority_queue = PriorityQueue.new
|
||
|
distance = Hash.new(Float::INFINITY)
|
||
|
distance[source_node] = 0
|
||
|
|
||
|
path = {}
|
||
|
|
||
|
graph.nodes.each { |node| priority_queue.add_with_priority(node, distance[node]) }
|
||
|
|
||
|
while priority_queue.count > 0
|
||
|
current_node = priority_queue.extract_min
|
||
|
current_node.neighbors.each do |node|
|
||
|
current_distance = distance[current_node] + 1
|
||
|
if current_distance < distance[node]
|
||
|
distance[node] = current_distance
|
||
|
path[node] = current_node
|
||
|
priority_queue.decrease_priority(node, current_distance)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
[distance, path]
|
||
|
end
|