u16suzuの blog

日々学んだことのメモブログです。

Rubyでグラフを表現してみる

class Vertex
  attr_accessor :id, :edges
  def initialize(id, edges=[])
    @id = id
    @edges = edges
  end

  def print
    puts "#{ @id }"

    @edges.each do |edge|
      puts edge
    end
  end
end

class Edge
  attr_accessor :id, :from, :to, :length
  def initialize(id, from, to, length)
    @id = id
    @from = from
    @to = to
    @length = length
  end

  def to_s
    "#{ from } => #{ to } #{ length }"
  end
end

class Graph
  attr_accessor :vertexes, :edges
  def initialize(data)
    @vertexes = []
    data.each do |k, v|

      edges = []
      v.each do |k2, v2|
        edges << Edge.new( 0, k ,k2, v2 )
      end

      @vertexes << Vertex.new( k, edges )
    end
  end

  def print_graph
    @vertexes.each do |v|
      v.print
    end
  end
end

data =
    {
        a: {b: 1, c: 3, d: 4},
        b: {b: 3, d: 11},
        c: {a: 1},
        d: {e: 11},
        e: {a: 1},
    }


g = Graph.new( data )
g.print_graph

実行結果

a
a => b 1
a => c 3
a => d 4
b
b => b 3
b => d 11
c
c => a 1
d
d => e 11
e
e => a 1