type unionfind struct {
count int //连通分量数
parent []int
}
//初始化
//x的父节点指向自己
func InitUF(n int) *unionfind{
uf :=new(unionfind)
uf.count = n
uf.parent = make([]int,n)
for i:=0;i<n;i++{
uf.parent[i] = i
}
return uf
}
//union
func (u unionfind) union(p,q int) {
rootp :=u.find(p)
rootq :=u.find(q)
if rootp == rootq {
return
}
u.parent[p] = rootq
u.count-- //连通分量减一
}
//find
func (u unionfind) find(x int) int {
for x != u.parent[x] {
x= u.parent[x]
}
return x
}
优化
type unionfind struct {
count int //连通分量数
parent []int
size []int //当前节点的所有结点数
}
//初始化
//x的父节点指向自己
func InitUF(n int) *unionfind{
uf :=new(unionfind)
uf.count = n
uf.parent,uf.size = make([]int,n),make([]int,n)
for i:=0;i<n;i++{
uf.parent[i] = i
uf.size[i] = 1 //初始节点数为1
}
return uf
}
//union
func (u unionfind) union(p,q int) {
rootp :=u.find(p)
rootq :=u.find(q)
if rootp == rootq {
return
}
//小树接到大树下面
if u.size[rootp] >u.size[rootq] {
u.parent[rootq] = rootp
u.size[rootp] +=u.size[rootq]
}else {
u.parent[rootp] = rootq
u.size[rootq] +=u.size[rootp]
}
u.count-- //连通分量减一
}
//find
func (u unionfind) find(x int) int {
for x != u.parent[x] {
//路径压缩
u.parent[x] = u.parent[u.parent[x]]
x= u.parent[x]
}
return x
}