Sha256: c6a170febff69412e2522f208febc6fe0962dd3d31896ba74fd71f8f6a5cfba4

Contents?: true

Size: 861 Bytes

Versions: 4

Compression:

Stored size: 861 Bytes

Contents

# Disjoint Set Union
class DSU
  def initialize(n = 0)
    # root node: -1 * component size
    # otherwise: parent
    @parent_or_size = Array.new(n, -1)
  end

  attr_accessor :parent_or_size

  def merge(a, b)
    x = leader(a)
    y = leader(b)
    return x if x == y

    x, y = y, x if -@parent_or_size[x] < -@parent_or_size[y]
    @parent_or_size[x] += @parent_or_size[y]
    @parent_or_size[y] = x
  end
  alias unite merge

  def same(a, b)
    leader(a) == leader(b)
  end
  alias same? same

  def leader(a)
    @parent_or_size[a] < 0 ? a : (@parent_or_size[a] = leader(@parent_or_size[a]))
  end
  alias root leader
  alias find leader

  def size(a)
    -@parent_or_size[leader(a)]
  end

  def groups
    (0 ... @parent_or_size.size).group_by{ |i| leader(i) }.values
  end
end

UnionFind        = DSU
UnionFindTree    = DSU
DisjointSetUnion = DSU

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ac-library-rb-0.5.3 lib/dsu.rb
ac-library-rb-0.5.2 lib/dsu.rb
ac-library-rb-0.5.1 lib/dsu.rb
ac-library-rb-0.5.0 lib/dsu.rb