并查集

并查集,用于判断两个点是否有相同的根节点。常用于图的连通性、根节点判断

type UnionFind struct {
    Parents []int // 数组,记录每个点的根节点
}

func (self *UnionFind) Init(n int) {
    self.Parents = make([]int, 0, n)
    self.Count = n
    for i := 0; i < n; i++ {
        self.Parents = append(self.Parents, i) // 初始化每个点的根节点为自己
    }
}

// 递归找u的根节点,并更新Parents数组
func (self *UnionFind) Find(u int) int {
    // 递归写法
    //parent := self.Parents[u]
    //if parent == u {
    //    return parent
    //}
    //root := self.Find(parent)
    //self.Parents[u] = root
    //return root
    
    // 非递归写法,效率更高
    root := self.Parents[u]
    for root != self.Parents[root] {
        root = self.Parents[root]
    }
    self.Parents[u] = root
    return root
}

// 连通u和v,将v的根节点指向u的根节点
func (self *UnionFind) Union(u, v int) bool {
    root1 := self.Find(u)
    root2 := self.Find(v)
    if root1 == root2 {
        return false
    }
    self.Parents[root2] = root1 // 将v的根节点指向u的根节点
    return true
}

Last updated