| 12345678910111213141516171819202122232425262728293031323334353637383940414243 | 
							- package main
 
- // UF ...
 
- type UF struct {
 
- 	ID   []int
 
- 	Size []int
 
- 	Cnt  int
 
- }
 
- // NewUF ...
 
- func NewUF(size int) UF {
 
- 	var uf UF
 
- 	uf.ID = make([]int, size)
 
- 	uf.Size = make([]int, size)
 
- 	for i := 0; i < size; i++ {
 
- 		uf.ID[i] = i
 
- 		uf.Size[i] = 1
 
- 	}
 
- 	uf.Cnt = size
 
- 	return uf
 
- }
 
- // Find ...
 
- func (uf UF) Find(id int) int {
 
- 	if uf.ID[id] != id {
 
- 		uf.ID[id] = uf.Find(uf.ID[id])
 
- 	}
 
- 	return uf.ID[id]
 
- }
 
- // Union ...
 
- func (uf UF) Union(i, j int) {
 
- 	fi, fj := uf.Find(i), uf.Find(j)
 
- 	if fi == fj {
 
- 		return
 
- 	}
 
- 	if uf.Size[fi] < uf.Size[fj] { // Swap fi, fj
 
- 		fi, fj = fj, fi
 
- 	}
 
- 	uf.ID[fj] = fi // Merge fj into fi
 
- 	uf.Size[fi] += uf.Size[fj]
 
- 	uf.Cnt--
 
- }
 
 
  |