1.定义并查集基本类型
type unionSet struct {
parent map[int]int
}
2.创建并查集
func NewUnionSet(nums []int) *unionSet {
us := unionSet{}
us.parent = make(map[int]int)
us.count = make(map[int]int)
for _, i := range nums {
us.parent[i] = i
us.count[i] = 1
}
return &us
}
3.核心方法find和union
func (u *unionSet) Find(x int) int {
if _, ok := u.parent[x]; !ok {
return -1000000001
}
if u.parent[x] != x {
u.parent[x] = u.Find(u.parent[x])
}
return u.parent[x]
}
func (u *unionSet) Union(p, q int) int {
rootP := u.Find(p)
rootQ := u.Find(q)
if rootP == rootQ {
return u.count[rootP]
}
u.parent[rootP] = rootQ
u.count[rootQ] = u.count[rootP] + u.count[rootQ]
return u.count[rootQ]
}
4.除了基本方法外,还可以视情况增加其他属性和方法,例如用于计算一个连通区域的count属性或者增加一个connected方法判断两个结点是否连通等。