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--
- }
|