并查集(Golang)

本文详细介绍了如何用Go语言实现并查集,从定义基本类型开始,到创建并查集,接着讲解核心的find和union方法。同时,讨论了如何扩展并查集,例如添加count属性来记录连通区域节点数,以及实现connected方法判断节点间连通性。这为图论和数据结构的学习者提供了清晰的实践指导。
摘要由CSDN通过智能技术生成

1.定义并查集基本类型

type unionSet struct {
	//parent[i] 表示i的父结点,根结点的父结点是本身
	parent map[int]int
	//count[i]可以用来保存本连通区域的结点个数
	//count  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

//find 用于查找x所在连通区域的根结点
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]
}

//union 用于合并两个连通区域
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方法判断两个结点是否连通等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值