uf.go 698 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package main
  2. // UnionFind ...
  3. type UnionFind struct {
  4. Cnt int64
  5. ID []int64
  6. Size []int64
  7. }
  8. // NewUF ...
  9. func NewUF(size int64) UnionFind {
  10. var uf UnionFind
  11. uf.Cnt = size
  12. uf.ID = make([]int64, size)
  13. for i := int64(0); i < size; i++ {
  14. uf.ID[i] = i
  15. }
  16. uf.Size = make([]int64, size)
  17. return uf
  18. }
  19. // Union ...
  20. func (uf *UnionFind) Union(p, q int64) {
  21. pID, qID := uf.Find(p), uf.Find(q)
  22. if pID == qID {
  23. return
  24. }
  25. if uf.Size[pID] < uf.Size[qID] {
  26. uf.ID[pID] = qID
  27. uf.Size[qID] += uf.Size[pID]
  28. } else {
  29. uf.ID[qID] = pID
  30. uf.Size[pID] += uf.Size[qID]
  31. }
  32. uf.Cnt--
  33. }
  34. // Find ...
  35. func (uf *UnionFind) Find(id int64) int64 {
  36. for id != uf.ID[id] {
  37. id = uf.ID[id]
  38. }
  39. return id
  40. }