uf.go 649 B

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