Skip to content

Instantly share code, notes, and snippets.

@vaskoz
Created September 8, 2013 06:21
Show Gist options
  • Save vaskoz/6482371 to your computer and use it in GitHub Desktop.
Save vaskoz/6482371 to your computer and use it in GitHub Desktop.
O(m*n) implementation of Prim's algorithm in Ruby
# Input: vertex1 (integer), vertex2 (integer), weight (integer)
require 'set'
edges = ARGF.readlines
edges.shift # Ignore first line if it has n, m don't need them
edges.map! {|a| a.split.map! {|j| j.to_i} }
vertices = Set.new(edges[0][0,1])
mst = []
until edges.empty?
min_edge = edges.min_by {|e| vertices.include?(e[0]) || vertices.include?(e[1]) ? e[-1] : Float::INFINITY}
vertices.merge(min_edge[0,2])
mst << min_edge
edges.delete_if {|e| vertices.include?(e[0]) && vertices.include?(e[1]) }
end
puts mst.map {|x| x[-1]}.inject {|sum, n| sum + n}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment