nahnahinin
Senior Member
Mã:
type DSU struct {
parent []int
rank []int
}
func NewDSU(n int) *DSU {
dsu := &DSU{
parent: make([]int, n),
rank: make([]int, n),
}
for i := 0; i < n; i++ {
dsu.parent[i] = i
dsu.rank[i] = 1
}
return dsu
}
func (dsu *DSU) Find(x int) int {
if dsu.parent[x] != x {
dsu.parent[x] = dsu.Find(dsu.parent[x])
}
return dsu.parent[x]
}
func (dsu *DSU) Union(x, y int) {
rootX := dsu.Find(x)
rootY := dsu.Find(y)
if rootX != rootY {
if dsu.rank[rootX] > dsu.rank[rootY] {
dsu.parent[rootY] = rootX
} else if dsu.rank[rootX] < dsu.rank[rootY] {
dsu.parent[rootX] = rootY
} else {
dsu.parent[rootY] = rootX
dsu.rank[rootX]++
}
}
}
func removeStones(stones [][]int) int {
n:=len(stones)
dsu := NewDSU(n)
w:=make(map[int]int)
u:=make(map[int]int)
for i:=0;i<n;i++{
if _, exists := w[stones[i][0]]; exists {
dsu.Union(i,w[stones[i][0]])
}
if _, exists := u[stones[i][1]]; exists {
dsu.Union(i,u[stones[i][1]])
}
w[stones[i][0]]=i
u[stones[i][1]]=i
}
vis:=make([]int,n)
for i:=0;i<n;i++{
vis[i]=-1
}
res:=0
for i:=0;i<n;i++{
z:=dsu.Find(i)
if vis[z]==-1{
res+=1
vis[z]=0
}
}
return n-res
}

