funcNewUF(nint)*UnionFind{parent:=make([]int,n)fori:=rangeparent{parent[i]=i}return&UnionFind{parent:parent,count:n,}}typeUnionFindstruct{parent[]intcountint}func(uf*UnionFind)Union(a,bint){rootA:=uf.Find(a)rootB:=uf.Find(b)ifrootA==rootB{return}uf.parent[rootA]=rootBuf.count--}func(uf*UnionFind)Find(aint)int{foruf.parent[a]!=a{// compress parent tree
uf.parent[a]=uf.parent[uf.parent[a]]a=uf.parent[a]}returna}func(uf*UnionFind)Connected(a,bint)bool{rootA:=uf.Find(a)rootB:=uf.Find(b)returnrootA==rootB}