| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | 
							- package main
 
- // UnionFind ...
 
- type UnionFind struct {
 
- 	Cnt  int64
 
- 	ID   []int64
 
- 	Size []int64
 
- }
 
- // NewUF ...
 
- func NewUF(size int64) UnionFind {
 
- 	var uf UnionFind
 
- 	uf.Cnt = size
 
- 	uf.ID = make([]int64, size)
 
- 	for i := int64(0); i < size; i++ {
 
- 		uf.ID[i] = i
 
- 	}
 
- 	uf.Size = make([]int64, size)
 
- 	return uf
 
- }
 
- // Union ...
 
- func (uf *UnionFind) Union(p, q int64) {
 
- 	pID, qID := uf.Find(p), uf.Find(q)
 
- 	if pID == qID {
 
- 		return
 
- 	}
 
- 	if uf.Size[pID] < uf.Size[qID] {
 
- 		uf.ID[pID] = qID
 
- 		uf.Size[qID] += uf.Size[pID]
 
- 	} else {
 
- 		uf.ID[qID] = pID
 
- 		uf.Size[pID] += uf.Size[qID]
 
- 	}
 
- 	uf.Cnt--
 
- }
 
- // Find ...
 
- func (uf *UnionFind) Find(id int64) int64 {
 
- 	for id != uf.ID[id] {
 
- 		id = uf.ID[id]
 
- 	}
 
- 	return id
 
- }
 
 
  |